适用对象
1、计算机相关类的技术人(研发、测试等)
2、对计算机编码感兴趣的其它人士
3、想知道为什么会出现乱码的人
本文的目的
本文从实用角度出发,并不会严格按照编码的规范来书写,如,字符集对应的字符编码名称并不准确,但不影响读者对编码整体的理解。主要目的是让读者对编解码有个初步的了解,以计算机中为什么会出现乱码。
为什么需要编码
计算机能理解的语言是二进制的(0,1),人类的语言(英文、中文以及其它语言)计算机是无法直接理解的,同样,计算机的二进制语言,人类也是无法直接理解的,所以需要进行转换,这个转换的过程就叫编解码。
由字符到字节叫编码,由字节到字符叫解码。
字符集与字符编码
计算机中存储信息的最小单元(能表示一个具体含义的内容,不是最小单位)是字节,一个字节包括8个二进制位(最小单位是位bit)。
用一个字节表示世界上所有的语言是不够的(2的8次方),所以人们又发明了字符的概念,用多个字节表示一个字符,不同语言有不同的字符集以及与对应二进制的转换关系。
字符的集合体叫做字符集,字符与二进制的转换规则叫做编解码。很多时候,我们说的ASCII编码,其实是包含了ASCII字符集以及其对应的字符编码,只不过很多字符集只有一种编码,所以才不会有问题,Unicode除外。
常见的字符集与字符编码:
| 字符集 |字符编码 |简单介绍 |
| ------- :| --------- :| -------- :|
| ASCII | ASCII |单字节,使用了7位 |
| ISO-8859-1 | ISO-8859-1 |也叫Latin-1,单字节,扩展了ASCII,可解码ASCII |
| GB2312 | GB2312 |小于0XFF用单字节,否则用双字节|
| GBK | GBK |扩展GB2312,规则同上,可解码GB2312|
| Unicode | UTF-8 |变长1-6字节|
| Unicode | UTF-16 |双字节|
| Unicode | UTF-32 |定长四字节|
造成乱码的原因
通过上面了解了什么叫做编码,以及字符集与字符编码,现在讲一下乱码是因为什么原因造成的。
以中文字符“我”为例,我的Unicode码是6211(UTF-16编码,十进制是25105)。
一个字符的“我”字,进行GBK编码,一个字符采用双字节表示(小于0XFF除外),然后再进行ISO-8859-1解码,一个字节对应一个字符,最终变成了两个字符。
进行ISO-8859-1编码,一个字符采用单字节表示,6211超出了其编码范围,所以用3f表示(未知),然后再进行ISO-8859-1解码,一个字节对应一个字符,最终变成了1个字符的“?”。
其它编码流程大体同上,还有更复杂的组合场景,如,将图1的结果再进行GBK编码与GBK解码(结果如何呢?)。
总之以上问题,都是因为在编码与解码的时候没有使用合适的字符集以及对应字符编码才导致出现了乱码的场景。
总结
本文首先介绍了什么叫做编码,为什么我们需要编码,然后介绍了常见的字符集以及对应的字符编码,最后介绍了乱码的原因。读者再理解了以上内容之后,如果在日常工作中再遇到编码问题,可以根据本文的内容进行分析,希望能帮到大家。