1980年,中国大陆制定了GB2312-80,简称GB2312。一共收录了7445个字符,包括6763个汉字和682个非汉字。
只包含有全角字符,而没有包含半角字符,比如说包含有“ABCDEFGHIJKLMNOPQRSTUVWXYZ”,而没有包含"ABCDEFGHIJKLMNOPQRSTUVWXYZ"。
每个字符都用双字节表示[3]。比如“A”字符在GB2312中的编码值为"区码:3;位码:33"(十进制)。
二、EUC-CN[2]
EUC-CN基于GB2312扩展得到,它所包含的字符集是GB2312所含的字符集+ASCII字符集。它跟GB2312的不同之处主要有两点:
1)GB2312是双字节编码,EUC-CN是变长字节编码
GB2312中每个字符都用双字节进行编码;EUC-CN中ASCII字符用单字节进行编码,相应的编码值跟ASCII中的值一致,其他字符用双字节进行编码。比如ASCII中的'A'字符,ASCII中对应的字节值为"0x41",在EUC-CN中,'A'字符对应单字节,字节值也为"0x41"。
2)EUC-CN中字符的双字节编码值是对GB2312中相应字符的双字节编码值偏移得到
具体的偏移规则是给每个字节值加上160。
比如在GB2312中,“外”这个字符的编码值是“45 66”(十进制),根据偏移规则可以得到“205 226”(十进制),以十六进制形式表示,得到“0xCD 0xE2”。又比如“A”字符在GB2312中的编码值为"区码:3;位码:33"(十进制),根据偏移规则,可以得到十进制的编码值为“163 193”,十六进制的编码值为“0xA3 0xC1”。
在EUC-CN中,既包含有全角字符,又包含有半角字符(ASCII中的字符),比如说既包含有“ABCDEFGHIJKLMNOPQRSTUVWXYZ”,又包含有"ABCDEFGHIJKLMNOPQRSTUVWXYZ"。
每个字符可能用单字节表示,也可能用双字节表示。
三、微软推出的关于GB2312的编码方案——旧的CP936[2]
微软推出的关于GB2312的编码方案跟EUC-CN完全一致,微软称该编码方案为CP936。(该CP936是旧的CP936,接下来会有新的CP936,要注意区分)
四、JDK1.7中推出的关于GB2312的编码方案[2]
JDK1.7中推出的关于GB2312的编码方案跟EUC-CN几乎一致,有两个编码值的字符定义不同而已。我们可以称该编码方案为“JDK-GB2312”。
在EUC-CN中,编码值“0xA1A4”对应“U+00B7 MIDDLE DOT”,而在JDK-GB2312中,该编码值对应“U+30FB KATAKANA MIDDLE DOT”;
在EUC-CN中,编码值“0xA1AA”对应“U+2014 EM DASH”,而在JDK-GB2312中,该编码值对应“U+2015 HORIZONTAL BAR”;
五、GB13000
同年,中国大陆制订了等同于Unicode 1.1版本的GB13000.1-93,简称GB13000(即采纳Unicode 1.1版本作为GB13000)
既包含有全角字符,又包含有半角字符,比如说既包含有“ABCDEFGHIJKLMNOPQRSTUVWXYZ”,又包含有"ABCDEFGHIJKLMNOPQRSTUVWXYZ"。[5]
每个字符都用双字节表示。比如"A"字符的编码值为"0x0041",“A”字符的编码值为“0xff21”。
六、新的CP936[6]
1993年,微软扩展了旧的CP936编码方案,推出了新的CP936编码方案,它收录的汉字字符扩展于GB13000的全部汉字字符(Unicode 1.1),即它收录了所有的GB13000中的汉字字符(即20902个汉字),并收录了在GB13000之后才产生的新的汉字字符,并且包含了其他一些非汉字字符。但是它采用的编码空间技术跟GB13000不同(也就是跟Unicode 1.1不同),它的编码空间技术以旧的CP936(也就是EUC-CN)的编码空间技术为主,旧的CP936中未被使用的编码空间用来收录“新的CP936中收录而未被收录于旧的CP936中的字符”。
新的CP936一共收录了21886个字符,其中包括了21003个汉字字符。
既包含全角字符,又包含半角字符,比如说既包含有“ABCDEFGHIJKLMNOPQRSTUVWXYZ”,又包含有"ABCDEFGHIJKLMNOPQRSTUVWXYZ"。
ASCII字符用单字节表示,其他字符都用双字节表示。比如“A”字符在新CP936中的编码值为"0xA3 0xC1"。
因此,从编码空间技术上来说,新的CP936兼容EUC-CN,和GB13000不同,不兼容GB13000,但是从所收录字符上来说,扩展于GB13000的全部汉字字符。
在微软推出了新的CP936编码方案后,中国大陆推出了跟新的CP936编码方案基本一致的编码方案,称为GBK。
GBK编码方案跟新的CP936编码方案的一个不同之处在于:GBK定义之字符较新的CP936多出95字(15个非汉字及80个汉字)。
现在的PC平台必须支持GB18030,对嵌入式产品不作要求。因此,手机,MP3一般只支持GB2312。
既包含有全角字符,又包含有半角字符,比如说既包含有“ABCDEFGHIJKLMNOPQRSTUVWXYZ”,又包含有"ABCDEFGHIJKLMNOPQRSTUVWXYZ"。
ASCII字符用单字节表示,其他字符都用双字节表示。比如“A”字符在GB18030中的编码值为"0xA3 0xC1"。
以上这些中文编码方案的关系如下图所示:
参考文献:
[1]http://www.crifan.com/files/doc/docbook/char_encoding/release/htmls/zhcn_charset_encoding.html[5]http://www.unicode.org/Public/1.1-Update/UnicodeData-1.1.5.txt
[6]http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP936.TXT
[7]https://zh.wikipedia.org/wiki/%E6%B1%89%E5%AD%97%E5%86%85%E7%A0%81%E6%89%A9%E5%B1%95%E8%A7%84%E8%8C%83