中文编码方案

编码方案包括两个方面的内容:一个是编码方案中包括的字符数;另外一个是编码方案中采取的编码空间技术,即某个字符对应的编码值。

一、GB2312[2]

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

1993年,国际标准Unicode 1.1版本出台。一共收录了34233个字符[4],包括了GB2312中所有的7445个字符,另外还对其进行了扩展,主要是包括了GB2312出台以后才简化的汉字(比如“镕”),台湾和香港使用的繁体字,日语和朝鲜语中的汉字等。在这34233个字符中,有20902个汉字。

同年,中国大陆制订了等同于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的全部汉字字符。


七、GBK[7][8][9]

在微软推出了新的CP936编码方案后,中国大陆推出了跟新的CP936编码方案基本一致的编码方案,称为GBK。

GBK编码方案跟新的CP936编码方案的一个不同之处在于:GBK定义之字符较新的CP936多出95字(15个非汉字及80个汉字)。


八、GB18030[10]
2000年,中国大陆出台了GB18030-2000,简称GB18030,它共收录了28427个字符,其中包括27484个汉字字符。它的编码空间技术兼容于GBK,而不是GB13000。

现在的PC平台必须支持GB18030,对嵌入式产品不作要求。因此,手机,MP3一般只支持GB2312。

既包含有全角字符,又包含有半角字符,比如说既包含有“ABCDEFGHIJKLMNOPQRSTUVWXYZ”,又包含有"ABCDEFGHIJKLMNOPQRSTUVWXYZ"。

ASCII字符用单字节表示,其他字符都用双字节表示。比如“A”字符在GB18030中的编码值为"0xA3 0xC1"。


以上这些中文编码方案的关系如下图所示:

中文编码方案_第1张图片


参考文献:

[1]http://www.crifan.com/files/doc/docbook/char_encoding/release/htmls/zhcn_charset_encoding.html
[2]https://en.wikipedia.org/wiki/GB_2312
[3]https://sourceware.org/ml/libc-alpha/2000-07/msg00309.html
[4]https://en.wikibooks.org/wiki/Unicode/Versions 

[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
[8]https://en.wikipedia.org/wiki/GBK
[9]http://ff.163.com/newflyff/gbk-list/
[10]http://intlconsultingllc.com/images/GB_18030_White_Paper-v2.pdf 

你可能感兴趣的:(中文编码方案)