这段时间,一直在搞和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码来存放显示,并且也不存在什么小尾大尾问题,只是纯粹的顺序排列。
原来是这样!!!!!!!!
评论