首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

汉字按unicode方式排序有关问题

2012-11-06 
汉字按unicode方式排序问题如何按照 Unicode 编码从小到大的顺序排列汉字呀?应该如何比较呀。求高人![解决

汉字按unicode方式排序问题
如何按照 Unicode 编码从小到大的顺序排列汉字呀?应该如何比较呀。求高人!

[解决办法]
那的看是什么编码的Unicode了。如果是Windows默认的UTF-16L的话,普通汉字可以直接这样

&((short *)a[0])

这样把a[0]的地址当作short指针取值。因为UTF-16L的内存顺序和Intel的小端短整型是一样的。

但是注意这样只能处理BMP基本映射平面上的字符。因为Unicode编码是32位的,所以额外的字符需要两个16位的值组成一个代理对表示。

代理对是一对 16 位值,用来表示 [0x010000..0x10FFFF] 范围
中的字符。该代理对的前半部分位于 [0xD800..0xDBFF] 范围中,后半部分位于 [0xDC00..0xDFFF] 范围中。这样的值对 (H, L) 表示按以下方式计算的字符 (十六进制算术运算):
(H - 0xD800) * 400 + (L – 0xDC00) 

所以你还要判断a[0]和a[1]的值是否符合上述范围,如果符合的话,需要按这个公式计算unicode编码值而不是直接用指针读取了。

我以前写Java大作业的时候写过类似的。
虽然说应该处理代理对,不过基本上常见的汉字都落在BMP里,所以可以直接用一个16位整数表示。
我排序的方式是用一个list,直接按值插入对应位置,最后按顺序遍历就可以了,C里的话可以用STL里的list。如果用65536的int数组也可以,只不过比较浪费内存。

热点排行