汉字按unicode方式排序问题

ericpowerful 2011-10-02 10:51:27
如何按照 Unicode 编码从小到大的顺序排列汉字呀?应该如何比较呀。求高人!
...全文
403 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Linux-Torvalds 2011-10-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ericpowerful 的回复:]

帮下忙呀!不胜感激!
[/Quote]http://www.cprogramming.com/tutorial/unicode.html
ericpowerful 2011-10-02
  • 打赏
  • 举报
回复
帮下忙呀!不胜感激!
辰岡墨竹 2011-10-02
  • 打赏
  • 举报
回复
那的看是什么编码的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数组也可以,只不过比较浪费内存。
ericpowerful 2011-10-02
  • 打赏
  • 举报
回复
大虾们帮忙呀
ericpowerful 2011-10-02
  • 打赏
  • 举报
回复
我现在是把一个汉字拆成了字符数组中的两个值,这样的话如何比较呀?相当于a[0],a[1]组成一个汉字,a[3]、a[4]组成一个汉字,a[0],a[1]组成的汉字与a[2],a[3]组成的汉字如何比较。谢谢了!
5t4rk 2011-10-02
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 linwhwylb 的回复:]

引用 1 楼 ericpowerful 的回复:

帮下忙呀!不胜感激!
http://www.cprogramming.com/tutorial/unicode.html
[/Quote]

这个方法貌似可行

69,370

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧