GB2312
简介
GB2312 是汉字字符集和编码的代号,中文全称为“信息交换用汉字编码字符 集”,由中华人民共和国国家标准总局发布,一九八一年五月一日实施。GB 是 “国标” 二字的汉语拼音缩写。
GB2312 字符集 (character set) 只收录简化字汉字,以及一般常用字母和符 号,主要通行于中国大陆地区和新加坡等地。GB2312 共收录有 7445 个字符, 其中简化汉字 6763 个,字母和符号 682 个。
GB2312 将所收录的字符分为 94 个区,编号为 01 区至 94 区;每个区收录 94 个字符,编号为 01 位至 94 位。GB2312 的每一个字符都由与其唯一对应 的区号和位号所确定。例如:汉字“啊”,编号为 16 区 01 位。
GB2312 字符集的区位分布表:
区号 字数 字符类别 01 94 一般符号 02 72 顺序号码 03 94 拉丁字母 04 83 日文假名 05 86 Katakana 06 48 希腊字母 07 66 俄文字母 08 63 汉语拼音符号 09 76 图形符号 10-15 备用区 16-55 3755 一级汉字,以拼音为序 56-87 3008 二级汉字,以笔划为序 88-94 备用区
GB2312 编码
GB2312 原始编码 (encoding) 是对所收录的每个字符都用两个字节 (byte) 表 示。第一字节为“高字节”,由字符的区号值加上 32 而形成;第二字节为“低字 节”,由字符的位号值加上 32 而形成。例如:汉字“啊”,编号为 16 区 01 位。 它的高字节为 16 + 32 = 48 (0x30),低字节为 01 + 32 = 33 (0x21),合并 而成的编码为 0x3021。
在区位号值上加 32 的原因大慨是为了避开低值字节区间。
由于 GB2312 原始编码与 ASCII 编码的字节有重叠,现在通行的 GB2312 编码 是在原始编码的两个字节上各加 128 修改而形成。例如:汉字“啊”,编号为 16 区 01 位。它的原始编码为 0x3021,通行编码为 0xB0A1。
如果不另加说明,GB2312 常指这种修改过的编码。
应该说GB2312的每一个汉字由两个字节构成,其中每一个字节的范围都在0xA1 ~0xFE,正好每一个字节都有94个编码范围,与区位码个数完全对应。
EUC-CN可以理解为GB2312的别名,和GB2312完全相同。
区位码更应该认为是字符集的定义,定义了所收录的字符和字符位置,而 GB2312及EUC-CN是实际计算机环境中支持这种字符集的编码。HZ和 ISO-2022-CN是对应区位码字符集的另外两种编码,都是用7位编码空间来支持 汉字。区位码和GB2312编码的关系有点像 Unicode和UTF-8。
GBK
GBK 编码是GB2312编码的超集,向下完全兼容GB2312,同时GBK收录了Unicode 基本多文种平面中的所有CJK汉字。同 GB2312一样,GBK也支持希腊字母、日文 假名字母、俄语字母等字符,但不支持韩语中的表音字符(非汉字字符)。 GBK还收录了GB2312不包含的汉字部首符号、竖排标点符号等字符。
GBK的整体编码范围是为:高字节范围是0×81-0xFE,低字节范围是0x40-7E和 0x80-0xFE,不包括低字节是0×7F的组合。
低字节是0x40-0x7E的GBK字符有一定特殊性,因为这些字符占用了ASCII码的位 置,这样会给一些系统带来麻烦。
有些系统中用0x40-0x7E中的字符(如“|”)做特殊符号,在定位这些符号时又 没有判断这些符号是不是属于某个 GBK字符的低字节,这样就会造成错误判断。 在支持GB2312的环境下就不存在这个问题。需要注意的是支持GBK的环境中小于 0x80的某个字节未必就是ASCII符号;另外就是最好选用小于0×40的ASCII符号 做一些特殊符号,这样就可以快速定位,且不用担心是某个汉字的另一半。 Big5编码中也存在相应问题。CP936和GBK的有些许差别,绝大多数情况下可以 把CP936当作GBK的别名。
GB18030
GB18030编码向下兼容GBK和GB2312,兼容的含义是不仅字符兼容,而且相同字 符的编码也相同。GB18030收录了所有Unicode3.1中的字符,包括中国少数民族 字符,GBK不支持的韩文字符等等,也可以说是世界大多民族的文字符号都被收 录在内。
GBK和GB2312都是双字节等宽编码,如果算上和ASCII兼容所支持的单字节,也 可以理解为是单字节和双字节混合的变长编码。GB18030编码是变长编码,有单 字节、双字节和四字节三种方式。
GB18030 的单字节编码范围是0x00-0x7F,完全等同与ASCII;双字节编码的范 围和GBK相同,高字节是0x81-0xFE,低字节的编码范围是0x40 -0x7E和 0x80-FE;四字节编码中第一、三字节的编码范围是0x81-0xFE,二、四字节是 0x30-0x39。
Windows 中CP936代码页使用0x80来表示欧元符号,而在GB18030编码中没有使 用0x80编码位,用其他位置来表示欧元符号。这可以理解为是 GB18030向下兼 容性上的一点小问题;也可以理解为0x80是CP936对GBK的扩展,而GB18030只是 和GBK兼容良好。
Unicode
每一种语言的不同的编码页,增加了那些需要支持不同语言的软件的复杂度。 因而人们制定了一个世界标准,叫做unicode。unicode为每个字符提供了唯一 的特定数值,不论在什么平台上、不论在什么软件中,也不论什么语言。也就 是说,它世界上使用的所有字符都列出来,并给每一个字符一个唯一特定数值。
Unicode 的最初目标,是用1个16位的编码来为超过65000字符提供映射。但这 还不够,它不能覆盖全部历史上的文字,也不能解决传输的问题 (implantation head-ache's),尤其在那些基于网络的应用中。已有的软件必 须做大量的工作来程序16位的数据。因此,Unicode用一些基本的保留字符制定 了三套编码方式。它们分别是UTF-8,UTF-16和UTF-32。正如名字所示,在 UTF-8中,字符是以8位序列来编码的,用一个或几个字节来表示一个字符。这 种方式的最大好处,是UTF-8保留了ASCII字符的编码做为它的一部分,例如, 在UTF-8 和ASCII中,“A”的编码都是0x41.
UTF-16和UTF-32分别是Unicode的16位和32位编码方式。考虑到最初的目的, 通常说的Unicode就是指UTF-16。在讨论Unicode时,搞清楚哪种编码方式非常 重要。
UTF-8
基本对照表
0x00000000 - 0x0000007F:
0xxxxxxx
0x00000080 - 0x000007FF:
110xxxxx 10xxxxxx
0x00000800 - 0x0000FFFF:
1110xxxx 10xxxxxx 10xxxxxx
0x00010000 - 0x001FFFFF:
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
0x00200000 - 0x03FFFFFF:
111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
0x04000000 - 0x7FFFFFFF:
1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
