编码技术总结

名称 产生原因 字节数 说明
ASCII 初始编码,匹配英文字符 1 一共规定了127个字符的编码,32以下的被作为控制字符
扩展ASCII 加入符号字符编码 1 加入新的字母符号,还加入了很多画表格时需要用下到的横线、竖线、交叉等形状,编码到255
GB2312 汉字编码 2 一个小于127的字符的意义与原来相同,但两个大于127的字符连在一起时,就表示一个汉字。因此小于127的编码与ascii相同,一共能编码7000多个简体汉字,是最常见的汉字编码方式
GBK 扩展GB2312汉字编码容量 2 只要第一个字节是大于127就固定表示这是一个汉字的开始,不管后面跟的是不是扩展字符集里的内容(能编码20000多汉字)。向下兼容GB2312
GB18030 扩展GBK汉字编码容量,加入少数名族语言 1、2、4变长编码 单字节与 ASCII 编码兼容,双字节兼容GBK,共收录汉字70244个,还加入了少数名族语言,中国非手持和嵌入式设备的强制编码需支持标准。向下兼容GBK
UTF-8 unicode的最通用的编码实现方式 1~4 根据不同的符号而变化字节长度。英文字母1个字符一个字节,汉字1个字符三个字节,从而降低了储存空间

关于Unicode

存储器容量发展,产生了Unicode,目的是试图将所有语言字符编码。它废弃了以往的其他编码方式重新编码,只是一个符号集。unicode把所有语言字符全对应成两个字节的二进制数字表示,但是它没有实现编码。若字节按unicode的方式,英文字符的编码将造成极大空间浪费。

Unicode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储,UTF-8是Unicode常见的编码方式。

Unicode实现的几种方式:

  • UTF-8:一个字符可以用1~4个字节表示,每次传输1个字节数据
  • UTF-16:一个字符可以用2个或4个字节表示,每次传输2或4个字节数据
  • UTF-32:一个字符可以用4个字节表示,每次传输4个字节数据

关于UTF-8 BOM头

实际上,不含 BOM 的 UTF-8 才是标准形式。
不同的文本编辑器对于有无BOM的称呼也略有不同,比如EditPlus,有BOM的称为UTF-8+,无BOM的称为UTF-8,而在Notepad++中,有BOM的被称为标准UTF-8,而无BOM则被称为UTF-8无BOM。

在 Windows 记事本的语境中

  • 所谓的「ANSI」指的是对应当前系统 locale 的遗留(legacy)编码,即默认编码方式的意思。对于英文文件是ASCII编码,对于简体中文文件是GB2312编码,对于繁体中文版会采用Big5码。
  • 所谓的「Unicode」指的是带有 BOM 的小端序 UTF-16。(UTF-8 不需要 BOM,尽管 Unicode 标准允许在 UTF-8 中使用 BOM,在网页上使用BOM是个错误)
  • 所谓的「UTF-8」指的是带 BOM 的 UTF-8。

参考资料

http://www.zhihu.com/question/20650946
http://dengo.org/archives/901