经常遇到 UTF-8、Unicode、ASCII 这些字符编码,以前从没深究过,甚是惭愧。现在终于弄懂了这些字符编码的来龙去脉,以及一些历史遗留问题,总结下来以备忘。
ANSII 编码:
一个字节组合出256(2的8次方)种不同的状态,在最早期的时候,美国人用,用前127个表示出包括英文字符、标点、控制码等。这样用一个字节表示一个字符,这个方案叫做 ANSII 编码。
GB2312 编码:
中国人得到计算机的时候,从128 到255的“扩展字符集”完全不够用了,中国常用汉字就6000多个。于是我们规定两个大于127的字符连在一起时,就表示一个汉字。连在 ASCII 里本来就有的数字、标点、字母都统统重新编了两个字节长的编码,这就是常说的”全角”字符,而原来在127号以下的那些就叫”半角”字符了。这也就是为什么小时候学习计算机的时候总要背“一个中文字符占用两个字节,一个英文字符占一个字节”。我们把这个方案叫做GB2312 编码。
GBK
和
GB18030:
后来发现,中国的汉字实在太多,GB2312 方案根本不够用,于是干脆规定只要第一个字节是大于127就固定表示这是一个汉字的开始,不管后面跟的是不是大于127。GBK 和GB18030 是对 GB2312的拓展。
至此,还是非常清楚的,接下来就是 utf 和 unicode 了。
每个国家都像中国一样有自己的字符编码,如果这样像今天的互联网跨国通信就不太可能了。所以,为了解决这一问题,一个叫做 ISO 的国际组织决定着手解决这一问题。他们废了所有的地区性编码方案,重新搞一个包括了地球上所有文化、所有字母和符号 的编码!他们叫它”Universal Multiple-Octet Coded Character Set”,俗称 “unicode“。刚开始的 unicode 统一占用两个字符,但其实对于 Unicode 字符集和编码是明确区分的。通常所说的 Unicode 只是世界上的语言字符和数字映射的一种标准,它并不限制字符的数量,它不定义传输和储存标准,而是交给 UTF(UCS Transfer Format) 编码方案去做。UTF-8就是每次8个位传输数据,而UTF-16就是每次16个位。UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度,当字符在ASCII码的范围时,就用一个字节表示,保留了ASCII字符一个字节的编码做为它的一部分,在 UTF-8 中一个汉字占3个字节。UTF-16 中一个汉字占两个字节,但是一个ASCII字符也同样会占用两个字节。
参考:http://www.qianxingzhem.com/post-1499.html
拓展:
关于有无bom头的区别 http://blog.youkuaiyun.com/esonbest1234/article/details/50729484
关于windows上常见的编码具体指什么,万恶的windows系统把unicode等同于UTF-16编码了啊。所以,以前你没搞懂这个不是你的错 微笑 :) http://blog.youkuaiyun.com/u012312373/article/details/47947879