暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Python如何对中文字符串按汉字内码排序?

语和言 2018-09-11
913

一、任务


现有若干个字符串,示例如下:


赵一

钱二

孙三

李四


要求在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编码顺序,真不知道它的排序原则是怎么规定的。


目前来看,一旦字符串中涉及到多音字,它的排序结果很可能就是乱的。

文章转载自语和言,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论