chaoshu的个人博客分享 http://blog.sciencenet.cn/u/chaoshu

博文

[转载]字符乱码说明

已有 8063 次阅读 2019-9-20 12:37 |个人分类:GIS|系统分类:科研笔记|文章来源:转载

名称

示例

特点

产生原因

古文码

鐢辨湀瑕佸ソ濂藉涔犲ぉ澶╁悜涓?

大都为不认识的古文,并加杂日韩文

以GBK方式读取UTF-8编码的中文

口字码

����Ҫ�¨2�ѧϰ������

大部分字符为小方块

以UTF-8的方式读取GBK编码的中文

符号码

由月è|å¥½å¥½å-|ä1 å¤©å¤©å‘上

大部分字符为各种符号

以ISO8859-1方式读取UTF-8编码的中文

拼音码

óéÔÂòaoÃoÃѧϰììììÏòéÏ

大部分字符为头顶带有各种类似声调符号的字母

以ISO8859-1方式读取GBK编码的中文

问句码

由月要好好学习天天向??

字符串长度为偶数时正确,长度为奇数时最后的字符变为问号

以GBK方式读取UTF-8编码的中文,然后又用UTF-8的格式再次读取

锟拷码

锟斤拷锟斤拷要锟矫猴拷学习锟斤拷锟斤拷锟斤拷

全中文字符,且大部分字符为“锟斤拷”这几个字符

以UTF-8方式读取GBK编码的中文,然后又用GBK的格式再次读取


GBK和UTF-8的相互转换

      好吧,这才是正题。

      从上面看到,一般来说UTF-8可应用于大多数场景,尤其是互联网上,而中文编码主要使用GBK编码,因此这就有了GBK、GB2312和UTF-8的相互转换需求。但要注意,GBK、GB2312等与UTF8之间都必须通过Unicode编码才能相互转换,也即:
    GBK、GB2312 ---> Unicode ---> UTF-8
    UTF8 ---> Unicode ---> GBK、GB2312

     比如拿汉字的“字”来举例,

 “字“的表示二进制表示16进制10进制字符串表示
GBK11010111 11010110 D7 D655254
Unicode01011011 010101115B 5723383
Utf-811100101 10101101 10010111E5 AD 9715052183

      同样,对于词语“中国.北京”,转换成UTF-8表示为:涓浗.鍖椾含。

      你要问我怎么转换的?原理什么的就不介绍了,在Windo平台下,通过一些Win API可以将GBK和Utf-8经过Unicode层进行相互转换。Linux下也是这样。另外由于各个编码规则都是确定的,因此各字符也就有了一种对应关系,这就使查表法也成为实现编码转换的一种方式。

GBK和UTF-8编码的检测

     上面简单介绍了各种编码以及他们的相互转换,但如果给定一个字符串,能够检测出其编码是什么吗? 比如对于“中国.北京”,检测出其为GBK或GB2312,而对于

”涓浗.鍖椾含“检测出其为UTF-8。那么对于一个给定的检测算法,是否保证肯定能检测到该字符串的真正编码方式吗?或者对于一个网页内容来说,很可能既存在GBK编码内容,也有UTF-8内容,那网页应该怎么显示(好像是检测编码,哪种编码出现的频率多,就使用哪种编码显示,臆测,不懂)?

     再举一个例子: “谢谢”,其UTF-8表示是“璋㈣阿”。从我的实现中,不论对于GBK编码的“谢谢”,还是UTF-8的“璋㈣阿”,都检测出是UTF-8编码。而我也不是第一个遇到这种情况的人,比如孟岩他老人家也遇到过检测失败的问题,不过他是在Ruby语言下发现的问题,而我是在C/C++实现中出现的检测失败。

     好吧,说到这里我也不知道说的是什么了,总之就是,

  • 各编码规则从应用角度来看,还挺复杂;

  • 编码转换和编码检测有时也不靠谱;





https://blog.sciencenet.cn/blog-858128-1198752.html

上一篇:基于MFC的MapWinGIS加载tif/shapefile文件
下一篇:利用GFZRNX批量拼接RINEX文件脚本
收藏 IP: 220.180.184.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-4-25 04:05

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部