首页 > 其他 > 详细

GB2312、Unicode编码等

时间:2015-10-08 00:24:18      阅读:241      评论:0      收藏:0      [点我收藏+]

---恢复内容开始---

我在CPP文件中,打算输出一行阿拉伯字符:

技术分享

当试图运行时,会弹出以下提示:

技术分享

即便点击“是”,运行之后也是显示不出来的:

技术分享

为什么会出现这种情况?

技术分享

可以看到cpp文件的编码格式:

技术分享

或者

技术分享

介绍下GB2312是信息交换汉字编码字符集,适用于汉字处理、汉字通信等系统之间的信息交换,通行于中国大陆。

GB 2312中对所收汉字进行了“分区”处理,每区含有94个汉字/符号。这种表示方式也称为区位码
01-09区为特殊符号。
16-55区为一级汉字,按拼音排序。
56-87区为二级汉字,按部首/笔画排序。
10-15区及88-94区则未有编码。
举例来说,“啊”字是GB2312之中的第一个汉字,它的区位码就是1601。
每个汉字及符号以两个字节来表示。
例如:
技术分享
输出:
技术分享
第一个字节称为“高位字节”(也称“区字节)”,第二个字节称为“低位字节”(也称“位字节”)。
 
“高位字节”使用了0xA1-0xF7(把01-87区的区号加上0xA0),“低位字节”使用了 0xA1-0xFE(把01-94加上 0xA0)。 由于一级汉字从16区起始,汉字区的“高位字节”的范围是0xB0-0xF7,“低位字节”的范围是0xA1-0xFE,占用的码位是 72*94=6768。其中有5个空位是D7FA-D7FE。
例如“啊”字在大多数程序中,会以两个字节,0xB0(第一个字节) 0xA1(第二个字节)储存。区位码=区字节+位字节(与区位码对比:0xB0=0xA0+16,0xA1=0xA0+1)。
技术分享
输出:
技术分享

如果强制使用ASNI编码输出则会输出乱码:

技术分享

如果按照Shift—JIS编码,会输出:

技术分享

我们改为一段日文进行尝试:

技术分享

输出结果就是正确的:

技术分享

当我们把编码格式转变为朝鲜语时:

技术分享

日文就显示不出来,但是其16进制编码还是可以显示出来的:

技术分享

我们发现尽管日文没有显示出来,但是其编码是一样的。

个人认为,其实不论编码格式是怎样的,字符在内存当中的存在都是以固定的二进制形式存在的,只是你用不同的编码方式去解析它,它被不同的解析方式解析之后,显示出来的字符就不同。比如你用GB2312编码格式去解析日文编码格式,就能成功解析日文,原因是GB2312编码中涵盖了这些日文。再比如你用阿拉伯语言编码格式去解析这三个日文字符就解析成这样:

技术分享

原因就在于虽然在内存中的存在是aaef、aabf、aab7这样的十六进制形式,但有可能你在使用的这个阿拉伯文编码格式中的阿拉伯字母编码都在3f以下,所以你只能解析3f以下的,这里的aaef、aabf、aab7显然超过了3f就被阿拉伯编码按照最大的3f进行解析了。

 

 

参考:

http://www.dreamdu.com/blog/2008/08/02/character_encoding/

http://www.cnblogs.com/xkfz007/articles/2566434.html

---恢复内容结束---

GB2312、Unicode编码等

原文:http://www.cnblogs.com/predator-wang/p/4859860.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!