一、任务
现有若干个字符串,示例如下:
赵一
钱二
孙三
李四
要求在Python中对这些字符串按找汉字内码排序,排序结果跟用C语言进行排序的结果一样。也就是排列成如下形式:
李四
钱二
孙三
赵一
二、环境
Win7中文旗舰版64位 + Python 3.64 64位 + GCC 4.5.2
三、C语言排序代码
#include <stdio.h>
int compare(const void *arg1, const void *arg2)
{
return strcmp((char*)arg1, (char*)arg2);
}
int main(int argc, char *argv[])
{
int i;
char str[4][5] = {"赵一", "钱二", "孙三", "李四"};
qsort((void*)str, 4, sizeof(str[0]), compare);
for (i=0; i<4; i++)
printf("%s\n", str[i]);
return 0;
}
四、Python排序代码

五、结果
原始序列:
赵一
钱二
孙三
李四
默认排序结果:
孙三
李四
赵一
钱二
按汉字内码升序排列结果:
李四
钱二
孙三
赵一
说明,Python内存中的字符串是用Unicode格式存储的,所以它的字符串默认排序规则是按字符的Unicode编码从小到大的顺序排列的。
六、附录
说我字数不够300,不给原创标签。难道微信公众号负责数数的软件只认识汉字吗?再说点别的凑够300字。
话说有个文本编辑软件叫EmEditor,我经常用它来处理正则表达式。这个软件有一个去重和排序功能很好用,之前没发现有什么问题。今天用它来排序突然发现了一个问题:它排序的结果居然跟预想的不一样。
文本示例如下:
长恨歌
双城记
重庆森林
九九艳阳天
用它的“CSV/排序”菜单里面的“字母升序排列”,得到如下的结果:
九九艳阳天
双城记
长恨歌
重庆森林
这可就奇怪了,它跟C语言排序的结果不一样,说明它不是按内码排序的,C语言的排序结果如下:
长恨歌
九九艳阳天
双城记
重庆森林
再用上面的Python代码排一下序,结果如下:
原始序列:
长恨歌
双城记
重庆森林
九九艳阳天
默认排序结果:
九九艳阳天
双城记
重庆森林
长恨歌
按汉字内码升序排列结果:
长恨歌
九九艳阳天
双城记
重庆森林
我们发现,EmEditor的排序结果既不是汉字内码顺序,又不是Unicode编码顺序,真不知道它的排序原则是怎么规定的。
目前来看,一旦字符串中涉及到多音字,它的排序结果很可能就是乱的。




