正文

GB18030中关于CJK的B扩展区的汉字显示和编码2008-06-02 17:32:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/miaowei/35841.html

分享到:

    这段时间,一直在搞和GB18030有关的东西,第一个东西只需要显示GB18030的双字节和CJK中A扩展区的汉字,这个问题搞了一段时间后,终于有了结果。具体参见我Blog中的另外一篇文章。

    最近,另外一个东西需要显示和对GB18030的CJK B扩展区的汉字显示和操作。发现前面的方法突然没办法解决这个问题,于是我上Google,上baidu。最后还是没搞定,后来又问同事,但是没几个人会搞这玩意。直到某一天,我又打开CJK B扩展区的码来看,突然不知道哪来的开了天眼,发现每个CJK B扩展区的汉字编码旁边还有一个UTF-16的两字节编码。如下所示:

汉字         GB18030         Unicode       UTF-16

𠀅             95328331         20005          D840DC05

 

于是我就想,总该不好显示Unicode码的,因为它是两个半字节,根本无法显示。于是我看UTF-16刚好是两个Unicode字节,我就死马当活马医,把这两个字节分别赋给一个Unicode数组,然后再显示这个Unicode数组。我就按照x86的小尾字节存放方式把它存放如下如下:

w_char_t  ch[3];

ch[0]=0xDC05;

ch[1]=0xD840;

ch[2]=0;

ExtTextOutW(pDC->GetSafeHdc(),0,0,ETO_OPAQUE,lprc,ch,2,NULL);

结果令我失望,还是不能显示,于是又陷入了迷茫之中..........若干小时又过了,突然,不知道又是那个菩萨保佑了我,我想那就按照大尾的顺序直接排列两个字节好了。于是更改代码如下:

 

w_char_t  ch[3];

ch[0]=0xD840;

ch[1]=0xDC05;

ch[2]=0;

ExtTextOutW(pDC->GetSafeHdc(),0,0,ETO_OPAQUE,lprc,ch,2,NULL);

唉,现在终于出来了,显示正常了。

原来,CJK B扩展区的汉字中,为了显示方便,每个汉字用了两个Unicode码来显示,但是为了方便,原则上还是按照字节排列上去,Unicode用两个半字节表示,但是同时它映射到UTF-16用来个Unicode码来存放显示,并且也不存在什么小尾大尾问题,只是纯粹的顺序排列。

原来是这样!!!!!!!!

阅读(5054) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册