|||
名称 | 示例 | 特点 | 产生原因 |
古文码 | 鐢辨湀瑕佸ソ濂藉涔犲ぉ澶╁悜涓? | 大都为不认识的古文,并加杂日韩文 | 以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进制 | 字符串表示 |
GBK | 11010111 11010110 | D7 D6 | 55254 | 字 |
Unicode | 01011011 01010111 | 5B 57 | 23383 | |
Utf-8 | 11100101 10101101 10010111 | E5 AD 97 | 15052183 | 瀛 |
同样,对于词语“中国.北京”,转换成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++实现中出现的检测失败。
好吧,说到这里我也不知道说的是什么了,总之就是,
各编码规则从应用角度来看,还挺复杂;
编码转换和编码检测有时也不靠谱;
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-11-5 12:16
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社