ISO/IEC 2022 七位或八位编码
ISO 2022,全称ISO/IEC 2022,由国际标准化组织(ISO)及国际电工委员会(IEC)联合制定,是一个使用7位或8位编码表示各种语言文字的通用技术规范。特别以东亚语言:汉语文字、日语文字或朝鲜文字的编码方法著称。
ISO 2022等同于欧洲标准组织(ECMA)的ECMA-35。中国国标GB 2312、日本工业规格JIS X 0202(旧称JIS C 6228)及韩国工业规格KS X 1004(旧称KS C 5620)均遵从ISO 2022。
早期计算机的字符编码基本上都是6位。所以早期计算机的整形的字长一般是6的倍数,如18位、24位、36位等。1963年公布的ASCII码是第一个得到广泛采用的7位字符编码。这时的通信领域的协议采用了第8位做校验纠错用途。但是,对于计算机内存来说,校验纠错变得不是必要。因此8位字符编码逐渐出现,用来表示比ASCII码更多的字符。为此,1971年公布的ECMA-35标准,用来规定各种7位或8位字符编码应当遵从的共同规则。随后ECMA-35被采纳为ISO 2022.
英语可用7位编码储存,而其他使用拉丁字母、希腊字母、西里尔字母、希伯来字母等的语文,由于只使用数十个字母,传统上均使用8位编码的ISO/IEC 8859标准来表示。但由于汉语、日语及朝鲜语字数众多,无法用单一个8位字符来表达,故需要多于一个字节来代表一个字。于是,ISO 2022就设计出来让汉语、日语及朝鲜语可以使用数个7位编码的字符来示。
ISO 2022使用“转义符串”(Escape sequence)。转义符串由1个“ESC”字符(0x1B),再由两至三个字串组成。此标记代表它后面的字符,属于下表字符集的文字。
ISO 2022用于兼容当时的7比特宽的通信协议/通信设备。对于7比特宽的编码空间,0x00-0x1F保留给控制字符,0x20-0x7F用来表示图形字符(printing/"graphic" characters)。因此,在1个7比特的字符编码空间,图形字符总计为94个(由于空格符占用了0x20码位、Del符占用了0x7F码位)或者96个。对于双字节的7比特编码空间,图形字符可以有94 x 94即8836个。1970年代至1980年代,中文、日文、韩文的字符集汉字编码数量基本上在这个范围内。
ISO 2022规定字符集的控制字符可分为两块:C0,C1; 打印(图形)字符分为四块:G0,G1,G2,G3。对于7比特编码, 字节值0x00-0x1F保留给C0控制字符块;字节值0x20-0x7F用于G0, G1, G2, G3字符块。对于单字节编码的字符集,1个打印(图形)字符块可包含94个或96个字符;对于双字节编码的字符集,1个打印(图形)字符块可包含94 x 94个字符。使用控制符的转义序列来表示在G0,G1,G2,G3之间的切换。
对于遵从ISO 2022的8比特编码字符集,也是按照上述7比特编码原则设计的编码方案。这种8比特编码字符集很容易兼容当时的7比特宽的通信协议/通信设备。8比特字符编码时,0x00-0x1F表示C0或称CL区(L是left缩写,因为其在字符表的左侧),0x80-0x9F表示C1或称CR(R是Right缩写,因为其在字符表的右侧)。0x20-0x7F表示G0 (称GL区),0xA0-0xFF(称GR区)可表示G1, G2, G3。
对于GB 2312,是8比特双字节编码。其汉字编码空间为94 x 94,即有94个区,每个区有94个位(用来编码字符)。实际使用了16-55区编码一级汉字,56-87区编码二级汉字。这些汉字均放在了G1字符块区。这种区位码方案是GB 2312的逻辑设计。其具体的字符编码方案(Character Encoding Scheme):字节值在0x00-0x7F,为单字节表示一个字符,构成了C0、G0区,与ASCII码兼容。因此,GB 2312是单、双字节混合编码。
GBK编码作为简体中文Windows操作系统的缺省的语言locale设置,GBK编码虽然完全向后兼容GB 2312,但GBK突破了ISO 2022中GR区域的字数的94²=8,836个字的限制。GBK编码的第一字节向 81–FE (126个选项,占用了C1区) 、第二字节向 40–FE (191个选项,占用了GL区、C1区) 进行扩展。随后的GB 18030在完全兼容GBK的基础上增加了4字节的编码,如果第二字节的值在0x30-0x3F范围,则随后的两个字节一起组成1个4字节编码的字符。
CNS 11643-1992,至1992年作为双字节编码包含了7个字面、48,027字。其具体的字符编码方案是采用控制字符转义序列,在不同的字面之间切换。
以ISO 2022标准来编码的字集包括:
- ISO-2022-JP - 日语文字
- ESC ( B 转为ASCII
- ESC ( J 转为JIS X 0201-1976
- ESC $ @ 转为JIS X 0208-1978
- ESC $ B 转为JIS X 0208-1983
- ISO-2022-JP-1 - 于ISO-2022-JP的基础上,加上以下一组逃逸字串
- ESC $ ( D 转为JIS X 0212-1990
- ISO-2022-JP-2 - 于ISO-2022-JP-1的基础上,加上以下四组逃逸字串,提供多语言支援
- ESC $ A 转为GB 2312-1980(简体中文)
- ESC $ ( C 转为KS X 1001-1992(朝鲜文)
- ESC . A 转为ISO 8859-1(西欧拉丁字母)
- ESC . F 转为ISO 8859-7(希腊字母)
- ISO-2022-JP-3 - 于ISO-2022-JP的基础上,加上以下两组逃逸字串
- ESC $ ( O 转为JIS X 0213-2000第一字面
- ESC $ ( P 转为JIS X 0213-2000第二字面
- ISO-2022-JP-2004 - 于ISO-2022-JP-3的基础上,加上以下一组逃逸字串
- ESC $ ( Q 转为JIS X 0213-2004第一字面
- ISO-2022-KR - 朝鲜文
- ESC $ ) C 转为KS X 1001-1992
- ISO-2022-CN - 中文
- ESC $ ) A 转为GB 2312-1980
- ESC $ ) G 转为CNS 11643-1992第一字面
- ESC $ * H 转为CNS 11643-1992第二字面
- ISO-2022-CN-EXT - 于ISO-2022-CN的基础上,加上以下六组逃逸字串
- ESC $ ) E 转为ISO-IR-165
- ESC $ + I 转为CNS 11643-1992第三字面
- ESC $ + J 转为CNS 11643-1992第四字面
- ESC $ + K 转为CNS 11643-1992第五字面
- ESC $ + L 转为CNS 11643-1992第六字面
- ESC $ + M 转为CNS 11643-1992第七字面