字符集
字符集只是一个规则集合的名字,
字符编码
对于一个字符集,要正确编码转码一个字符需要三个关键元素:
- 字库表(character repertoire): 所有可读或者可显示字符的数据库。
- 编码字符集(coded character set): 用一个编码值表示一个字符在字库中的位置
- 字符编码(character encoding form):将编码字符集和实际存储数值之间的转换关系。
ASCII码
在计算机内部,所有的信息最终被表示为一个二进制的字符串。每一个二进制位(bit)有0和1两种状态,因此八个二进制位(即一个字节)就可以组合出256种状态。也就是说一个字节可以用来表示256种不同的状态。
上世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定,即ASCII码。
ASCII码一共规定了128个字符的编码。这128个字符只占用了一个字节的后面7位,最前面的一位统一规定为0.
Unicode
如果有一种编码,将世界上所有的符号都纳入其中,每个符号都给予一个独一无二的编码,那么乱码问题就会消失。Unicode就是一种所有符号的编码。
Unicode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。
UTF-81
UTF-8是Unicode的实现方式之一。UTF-8最大的一个特点,就是它是一种变长的编码方式,可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。
UTF-8编码实现方式
- 如果一个字节的第一位为0,那么代表当前字符为单字节字符,占用一个字节的空间。0之后的所有部分(7bit)代表在Unicode中的序号,此时,UTF-8和ASCII是一致的。
- 如果一个字节以110开头,那么代表当前字符为双字节字符,占用两个字节的空间。110之后所有部分(5bit)加上后一个字节的除10外的部分(6bit)代表Unicode中的序号,且第二个字节以10开头
- 如果一个字节以1110,那么代表当前字符为三字节字符,占用3个字节的空间。1110之后的所有部分(5bit)加上后两个字节的除10外的部分(12bit)代表在Unicode中的序号,且第二、第三个字节以10开头
- 如果一个字节以11110开头,那么代表当前字符为四字节字符,占用4个字节的空间。11110之后所有部分(3bit)加上后面3个字节的除了10以外的部分(18bit)代表在Unicode中的序号。
- 如果一个字节以10开头,那么代表当前字节为多字节字符的第二个字节。10之后的所有部分(6bit)和之前的部分一同组成在Unicode中的序号。
windows上常见的ANSI[^4]
在windows系统上保存文本文件,常见到ANSI格式,该格式时默认编码,对于英文文档是ASCII编码,对于中文文本是GB2312编码
参考文献
- http://www.imkevinyang.com/2009/02/%E5%AD%97%E7%AC%A6%E7%BC%96%E8%A7%A3%E7%A0%81%E7%9A%84%E6%95%85%E4%BA%8B%EF%BC%88ascii%EF%BC%8Cansi%EF%BC%8Cunicode%EF%BC%8Cutf-8%E5%8C%BA%E5%88%AB%EF%BC%89.html/comment-page-1
[2]. http://cenalulu.github.io/linux/character-encoding/
[3]. http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html
[^4]: http://blog.jobbole.com/107762/ ↩