- 1、本文档共2页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
用strcoll实现中文按拼音排序
用 strcoll 实现中文按拼音排序
C 语言从 C94 引入多语言支持以后处理中文方便多了。即使不用 wchar_t 也可以获得很多好处,比如增加了 strcoll 这个根据 locale 比较字符串的函数。
简单地说,一个 locale 就是一组处理跟语言相关问题的规则,这里有一篇简介。这些规则就包括如何对字符串进行比较和排序。按照 C94 及 C99 标准的规定,程序在启动时设置 locale 为 C。在 C locale 下,字符串的比较就是按照内码一个字节一个字节地进行,这时 strcoll 与 strcmp 函数没有区别。在其他 locale 下,字符串的比较方式则不同了,例如在简体中文 locale 下,strcmp 仍然按内码比较,而 strcoll 对于汉字则是按拼音进行的(这也跟操作系统有关,Windows 还支持按笔划排序,可以在“区域和语言设置”里面修改)。
在 C 语言里面,用 setlocale 函数设置当前 locale,在程序开头使用一句 setlocale (LC_ALL, ); 就可以了。第二个参数为空串表示依照操作系统的当前设置。下面是一个示例程序(须使用 C 编译器;如果要用 C++ 编译器,还要自己封装一下 strcoll 或者加一个强制类型转换):
#include stdio.h
#include string.h
#include stdlib.h
#include locale.h
int main (void)
{
int i;
char str[10][4]= {镕,堃,趙,錢,孫,李,周,吳,鄭,王};
qsort (str, 10, 4, strcoll);
printf (按内码排序:);
for (i=0; i10; i++)
printf (%s, str[i]);
setlocale (LC_ALL, );
qsort (str, 10, 4, strcoll);
printf (\n按音序排序:);
for (i=0; i10; i++)
printf (%s, str[i]);
return 0;
}
程序输出(操作系统 GNU/Linux,locale 为 zh_CN.UTF-8):
按内码排序:吳周堃孫李王趙鄭錢镕
按音序排序:堃李錢镕孫王吳趙鄭周
程序输出(操作系统 Windows, locale 为 Chinese_Peoples Republic of China.936):
按内码排序:吳堃孫李王周趙鄭錢镕
按音序排序:堃李錢镕孫王吳趙鄭周
按内码排序的差别是因为两个测试里使用了不同的内码,但可以看出第二行的结果相同。之所以用了生僻字和繁体字为例,是因为一级汉字在 GB2312 里面恰好是按拼音排的,体现不出差别了。
另外,使用宽字符(wchar_t)的程序在开头一定要使用 setlocale,不然会遇到很多麻烦,比如 wprintf 不能输出中文……
文档评论(0)