一、编码格式和字符集
编码,意思是指将数据通过一定方式表达或储存,这个方式就叫编码。在计算机中,使用相应的标准存储自然语言的方式就叫做编码格式。
字符集,在计算机内部,规定一组字符的集合对应自然语言,这个统一的标准叫编码,而与自然语言对应的这组字符的集合就叫做字符集。计算机发展史中已经存在很多的字符集,如GB2312字符集,GBK字符集等等。
二、编码格式发展史
在计算机设计之初,人们使用8个开闭式晶体管可以组成一组状态,其中,0开始的32种为控制码,后面加上字母,数字等共128个存储信息,他们把这套方案叫做 ANSI 的“ascii”编码。
后来,计算机发展,后面的128个空位被其他国家陆续占用,而128到255这一页的字符集合就被成为“扩展字符集”。
等到了中国人得到计算机时,已经没有可以利用的字节状态来表示汉字了,于是国人自主研发,把127号之后的奇异符号直接取消掉。规定:一个小于127的字符意义与原来相同,但是两个大于127的字符连在一起时,就表示一个汉字,前面的一个字节(他称为高字节)从0xA1到0xF7,后面一个字节(低字节)从0xA1到0xFE,这样大约组合出7000多个简体汉字。然后加了一些其他字符,就统统重新编了两个字节长的编码,这就是常说的“全角”字符,而原来的127号以下的那些就叫“半角字符”。国民看到这样很不错,于是就把这套方案叫做“GB2312”。GB2312 是对 ASCII 的中文扩展。
后来,仅使用GB2312字符集很多中文字符在电脑中无法打出来,于是干脆不再要求低字节一定是127号之后的内码,只要第一个字节是大于127就固定表示这是一个汉字的开始,不管后面跟的是不是扩展字符集里的内容。扩展之后的编码方案被称为 GBK 标准,GBK包括了GB2312 的所有内容,同时又增加了近20000个新的汉字(包括繁体字)和符号。总之 GBK 是对 GB2312 的扩展。
后来少数民族也要用电脑了,于是我们再扩展,又加了几千个新的少数民族的字,GBK扩成了GB18030。从此之后,中华民族的文化就可以在计算机时代中传承了。 中国的程序员们看到这一系列汉字编码的标准是好的,于是通称他们叫做 “DBCS”(DoubleByte Charecter Set, 双字节字符集)。
在中国开始建造自己的字符集时,各个国家也都有了自己的编码,这样互相交流起来就不方便了,有个叫做ISO的组织想了一个办法来解决这个问题。他们规定,废除地方性的编码方式,改用全球统一的编码,他们还为此编码格式取了个名字,叫“Universal Multiple-Octet Coded Character Set”,即通用多八位编码字符集,也就是我们常说的“Unicode”字符集。
ISO规定所有的字符(注意,这里的字符指的是广义上的字符,也就是符号)必须用两个字节来表示,对于ASCII里的那些“半角”字符,unicode包持其原编码不变,只是将其长度由原来的8位扩展为16位,而其他文化和语言的字符则全部重新统一编码。由于”半角”英文符号只需要用到低8位,所以其高8位永远是0,因此这种大气的方案在保存英文文本时会多浪费一倍的空间。同时,Unicode 编码无法区分ASCII 字符。
而在UNICODE到来的时候,还有计算机网络的兴起,字节在网络上怎么传输,这时候就有了UTF(UCS transform format)标准,其中UTF-8就是每次8个位传输数据。 而UTF-16就是每次16个位。UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度,当字符在ASCII码的范围时,就用一个字节表示,保留了ASCII字符一个字节的编码做为它的一部分,注意的是unicode一个中文字符占2个字节,而UTF-8一个中文字符占3个字节)。从Unicode到UTF-8并不是直接的对应,而是要过一些算法和规则来转换。
三、中文编码总结
中文字符常见的编码方式有:GBK,GB2312 和 UtF-8。这些都是内码,即中文字符存储在计算机中的二进制字符编码方式。他们的存储方式对比:
编码方式 | 中文字符占内存 | 英文字符占内存 | |
GB2312 | 定长编码 | 2个字节 | 一个字节 |
GBK | 定长编码 | 2个字节 | 一个字节 |
UTF-8 | 变长编码 | 3个字节 | 一个字节 |
由于同一个字符使用不同的编码方式在计算机内部使用的内码可能不同,所以,若计算机终端(控制台)的编码方式跟文本保存的编码方式不同,其输出的文字就是乱码了。