gb2312编码在线转换_浅谈⼏种常见的字符编码
引⼦
相信⼤家平时⼯作和⽣活中,都遇到过乱码的现象。⽐如PDF格式的⽂件复制粘贴到Word⽂件中,很容易出现错误,影响对⽂件的识别。那么这种现象是如何产⽣的呢?下⾯就带⼤家⼀探究竟。
ASCII
最早⼴泛使⽤,名⽓最⼤的编码⽅式当属ASCII(美国标准信息交换码)。众所周知,计算机内部的所有信息最终都是⼀个⼆进制值。每⼀个⼆进制位(bit)有0和1两种状态,因此⼋个⼆进制位就可以组合出256种状态,这也被称为⼀个字节(byte)。也就是说,⼀个字节可以表⽰256种不同的状态,每⼀个状态对应⼀个符号,就是256个符号。
ASCII码由⼀张主表和⼀张扩展表组成,如下图,图源⽹络。
使⽤WinHEX以16进制打开内容为“AB”的ASCII编码⽅式的⽂本⽂件,可以看到其值为0x41、0x42对应⼗进制的65、66,符合上表内容。
ASCII码表对于以英语为母语的国家来说,⾜够⽤了。但对于其他国家来说,明显是不能满⾜需求的。所以,在计算机传⼊中国以后,中国专家制定了GB2312/GB2312-80编码。
中⽂字符编码
GB2312/GB2312-80
由于扩展ASCII码表不常⽤,中国专家整合了扩展ASCII码表(即128-255)并进⾏了重新编码,规定:⼀共⼩于127的字符的意义与原来相同,但当两个⼤于127的字符连在⼀起时,就表⽰⼀个汉字,这样我们就可以组合出⼤约7000个简体汉字。上述编码规则就是GB2312或GB2312-80(国标码)。
经过对本来ASCII⾥就有的数字、标点、字母进⾏两个字节场的重新编码,就形成了常说的"全⾓"字符,⽽原来⼩于127号的那些就叫"半⾓字符"。
使⽤WinHEX以16进制打开内容为“AB中国”的GB2312编码⽅式的⽂件,可以清楚的看到A、B仍然存储为0x41、
0x42;“中”和“国”均由2个处于0x80-0xFF的⼗六进制数(对应⼗进制的128-255)表⽰。
GB2312/GB2312-80包含了⼤部分常⽤汉字。然⽽在⽣产⽣活中,我们时不时的会使⽤到⼀些⽣僻字,在此基础上就诞⽣了GBK编码。GBK
GB2312⽀持的汉字太少。1995年的汉字扩展规范GBK1.0收录了21886个符号,它分为汉字区和图形符号区。其中汉字区包括21003个字符。
从ASCII、GB2312到GBK,这些编码⽅法是向下兼容的,即同⼀个字符在这些⽅案中总是有相同的编码,后⾯的标准⽀持更多的字符。在这些编码中,英⽂和中⽂可以统⼀处理。字符不论中英⽂均使⽤双字节来表⽰,只不过为了区分中⽂,才将其最⾼位都定成1。
由于GBK与GB2312和SCII编码兼容,所以在常⽤字符上,⼆者编码⼀致,为避免重复,此处不在图上详细讲解。
GBK编码很好地满⾜了我们国家民众的需求,但这种⽅式也有其弊端。如跨国交流的时候,像中国和⽇本、韩国等使⽤象形⽂字的国家之间,传送⽂件后仍会出现乱码现象。在此种情况下,Unicode应运⽽⽣。
UNICODE
Unicode是⼀个编码⽅案,说⽩了就是⼀张包含全世界所有⽂字的⼀个编码表,只要这个世界上存在的⽂字符号,统统给你⼀个唯⼀的编码。Unicode编码范围是: 0-0x10FFFF,可以容纳100多万个符号。
Unicode其实更像是⼀个符号集,它只规定了符号的⼆进制代码,却没有规定这个⼆进制代码应该如何存储。
Unicode 编码共有三种具体实现,分别为UTF-8,UTF-16,UTF-32。我们平时所说的Unicode 编码默
认是指UTF-16编码。
UTF-16
UTF-16编码以16位⽆符号整数为单位,注意是16位为⼀个单位,不能⼀股脑地认为UTF-16编码就是16位;这个要看字符的unicode编码处于什么范围⽽定,有可能是2个字节,也可能是4个字节。
同样以内容为“AB中国”的⽂本⽂件为例,最前⾯的“FF FE”被称为BOM,这个下⽂会提到,先不谈。可以看到即便是A、B这种原本只⽤⼀个字节能表⽰的字符,也仍旧占据了两个字节。
在本地还好,只是浪费点磁盘空间,但是在⽹络传输时,⼗分占⽤资源,尤其对英语母语的国家⽽⾔。
UTF-32
UTF-32是对Unicode编码的最简单粗暴的实现⽅式,即每个字符均有4个字节表⽰。UTF-16尚且算浪费
资源,更何况UTF-32呢?由于其过于浪费资源,使⽤范围很窄,本⽂在这⾥就不详谈了。
那么有没有⼀种⽐较省资源的编码⽅式呢?答案是有,即UTF-8编码。
UTF-8
UTF-8是⼀种⾮常灵活的编码⽅式,其根据字符在Unicode编码中的位置来决定其由⼏个字节组成。对应关系如下表:
Unicode编码(16进制)UTF-8字节流(⼆进制)
在线二进制转换
000000 - 00007F0xxxxxxx
000080 - 0007FF110xxxxx 10xxxxxx
000800 - 00FFFF1110xxxx 10xxxxxx 10xxxxxx
010000 - 10FFFF11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
同样以内容为“AB中国”的⽂本⽂件为例,最前⾯的“EF BB BF”被称为BOM,先忽略。字符A、B处在000000 - 00007F范围内,所以仍为0x41、0x42,很容易理解。难点在"中"和"国“的编码。
以”中“为例,“中”的Unicode编码为4E 2D,处于000800 - 00FFFF范围内。将4E 2D化为⼆进制“0100  1110  0010  1101”,按照上表中第三⾏右侧的情况分组,然后在最前⾯填充“1110”、“10”、”10“,最后在重新转成16进制即可。“国”同理,由兴趣的读者可以尝试推导下。
4      E      2    D    0100  1110  0010  1101    0100  111000  10110111100100 10111000 10101101  E4      B8      AD
因为UTF-8编码⽅式灵活,所以相应的其解码所需的时间也⽐UTF-16和UTF-32要长。
BOM
BOM(Byte Order Mark),字节顺序标记,出现在⽂本⽂件头部,Unicode编码标准中⽤于标识⽂件是采⽤哪种格式的编码。
以UTF-16和UTF-8为例:
编码格式⽂件起始标识
UTF-8EF BB BF
UTF-16LE(⼩端存储)FF FE
UTF-16BE(⼤端存储)FE FF
⼤端存储和⼩端存储
·概念
⼤端存储与⼩端存储模式主要指的是数据在计算机中存储的两种字节优先顺序。
·⼩端存储:⾼位字节放在⾼地址,低位字节存放在低地址。·⼤端存储:⾼位字节放在低地址,低位字节存放在⾼地址。
例如要表⽰0x12345678
偏移地址:  0x 00  01  02  03⼩端存储:    78  56  34  12⼤端存储:    12  34  56  78
·
各⾃优点:·⼩端存储:便于数据之间的类型转换,例如:long类型转换为int类型时,⾼地址部分的数据可以直接截掉。·⼤端存储:便于数据类型的符号判断,因为最低地址位数据即为符号位,可以直接判断数据的正负号。·⽤途:·⼩端存储:常见于本地主机上(也有部分类型主机为⼤端存储)和x86平台。·⼤端存储:常见于⽹络通信和arm/移动平台上,⽹际协议TCP/IP在传输整型数据时⼀般使⽤⼤端存储模式表⽰,例如TCP/IP中表⽰端⼝和IP时,均采⽤的是⼤端存储
⼯具推荐
总结
尽管编码⽅式多种多样,现实⽣活中仍需灵活选择。若选择国际通⽤,则选择UTF-8编码;若仅仅是国内使⽤,则选择GBK编码(因为UTF-8中汉字占了3个字节,反⽽浪费了空间)。其他编码,可以⾃取所需。
此外,若遇到乱码问题,可以使⽤Windows平台内置的记事本打开⽂件后,点击⽂件菜单中的“另存为命令”,点击对话框最底部编码的下拉条,保存即可。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。