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。

## 引言

<image>

早期计算机的字符编码基本上都是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用来：

- 在一种字符编码下表示属于多个字符集的字符。
- 表示大字符集。
- 兼容7比特信道，即使是8比特编码字符集。

ISO 2022使用“转义符串”（Escape sequence）指出随后的字符属于哪个字符集。这些字符集在ISO登记，并遵循ISO 2022标准规定的模式。转义符串由1个“ESC”字符（0x1B），再由两至三个字串组成。此标记代表它后面的字符，属于下表字符集的文字。对于一个字符集，如果上下文可以判明是哪种字符集，也可以不通过转义序列来明确指出是哪种字符集。实际上，ISO-8859-1就宣布不需要定义它的转义序列。

## ISO 2022的主要内容

ISO 2022用于兼容当时的7比特宽的通信协议/通信设备。对于7比特宽的编码空间，0x00-0x1F保留给控制字符，0x20-0x7F用来表示图形字符（printing/"graphic" characters）。因此，在1个7比特的字符编码空间，图形字符总计为94个（由于空格符占用了0x20码位、Del符占用了0x7F码位）或者96个。对于双字节的7比特编码空间，图形字符可以有94 x 94即8836个。对于三字节的7比特编码空间，图形字符可以有94×94×94即830584个（虽然没有三字节字符集向ISO登记）。1970年代至1980年代，中文、日文、韩文的字符集汉字编码数量基本上在这个范围内。对于双字节编码的字符的每个code point，日文译作区点，中文译作码位；area在中日文均译作“区”，point在日文译作“点”，在中文译作“位”。因此，GB2312及其相关字符集国标，采用了“区位码”。

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。

ISO-8859-X字符集是特定的把ISO-2022的若干成分组合起来的字符集。这些成分包括：

- 低端控制字符(C0)
- US-ASCII字符集(GL)
- 高端控制字符(C1)
- 高端字符(GR)是特定于每个ISO-8859-X变种。例如ISO-8859-1是由ISO-IR-1, ISO-IR-6, ISO-IR-77, ISO-IR-100 组成。

对于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/IEC 2022编码在字符码值与显示的字符之间给出了两层映射。转义序列允许任何大的登记的图形字符集指代于四个工作集之一：即G0到G3，以及更短的控制序列指出被使用"invoked"的工作集以解释流中的字节。

7比特ASCII图形字符的范围(0x20–0x7F)，是在字符编码表的左侧，称作"GL"码(表示"graphics left")，"高位ASCII"码的范围(0xA0–0xFF), 被称作"GR"码("graphics right")。

默认, GL码指代G0字符, GR码指代G1字符，但这可被控制码或早先的协议修改：

码｜缩写.｜名字｜效果

0x0F｜SILS0｜Shift InLocking shift zero｜GL编码G0从现在开始

0x0E｜SOLS1｜Shift OutLocking shift one｜GL 编码G1从现在开始

ESC 0x6E (n)｜LS2｜Locking shift two｜GL 编码G2从现在开始

ESC 0x6F (o)｜LS3｜Locking shift three｜GL 编码G3从现在开始

0x8EESC 0x4E (N)｜SS2｜Single shift two｜GL 编码G2仅用于下一个字符

0x8FESC 0x4F (O)｜SS3｜Single shift three｜GL 编码G3仅用于下一个字符

ESC 0x7E (~)｜LS1R｜Locking shift one right｜GR 编码G1从现在开始

ESC 0x7D (})｜LS2R｜Locking shift two right｜GR 编码G2从现在开始

ESC 0x7C (|)｜LS3R｜Locking shift three right｜GR 编码G3从现在开始

四个工作集的每个可表示94个字符或94n字符。此外，G1到G3可表示96或96n个字符。当后者被用在GL区域，空格字符与delete字符(码值0x20与0x7F)不可用。

还有一些罕用的特性可切换控制字符集，这是单层查询：the 0x00–0x1F范围是C0控制字符集，0x80–0x9F范围是C1控制字符集，转义序列可以切换不同的选择。要求任何C0字符集包含ESC字符出现在码位0x1B。

在上述SS2与SS3例子中，C1控制字符集中的单个控制字符可被7比特编码用于序列`ESC 0x40 (@)`到`ESC 0x5F (_)`。额外的控制功能可用于范围ESC 0x60 (`)到`ESC 0x7E (~)`。

转义序列指代字符集采取这样的形式`ESC ''I'' [''I''...] ''F''`, 其中有一个或多个中间的I字节来自范围0x20–0x2F, 一个最后的F字节来自0x40–0x7F。(范围0x30–0x3F被保留用于私用F字节)。I字节辨识字符集类型与被指代的工作集，F字节辨识字符集自身。

码值｜十六进制｜缩写｜名字｜效果

ESC ! F｜1B 21 F｜CZD｜C0-designate｜F选择一个C0控制字符集来使用.

ESC " F｜1B 22 F｜C1D｜C1-designate｜F选择一个C1控制字符集来使用.

ESC % F｜1B 25 F｜DOCS｜Designate other coding system｜F选择一个8-bit编码；使用`ESC % @`返回到ISO/IEC 2022.

ESC % / F｜1B 25 2F F｜DOCS｜Designate other coding system｜F选择一个8-bit编码；没有标准方法返回。

ESC & F｜1B 26 F｜IRR｜Identify revised registration｜F被调整到范围1-63, 指出立即跟随的登记的哪一个修改版被需要，使得老系统知道自身过时了。

ESC ( F｜1B 28 F｜GZD4｜G0-designate 94-set｜F选择一个94个码位的字符集被用于G0.

ESC ) F｜1B 29 F｜G1D4｜G1-designate 94-set｜F选择一个94个码位的字符集被用于G1.

ESC、F｜1B 2A F｜G2D4｜G2-designate 94-set｜F选择一个94个码位的字符集被用于G2.

ESC + F｜1B 2B F｜G3D4｜G3-designate 94-set｜F选择一个94个码位的字符集被用于G3.

ESC - F｜1B 2D F｜G1D6｜G1-designate 96-set｜F选择一个96个码位的字符集被用于G1.

ESC . F｜1B 2E F｜G2D6｜G2-designate 96-set｜F选择一个96个码位的字符集被用于G2.

ESC / F｜1B 2F F｜G3D6｜G3-designate 96-set｜F选择一个96个码位的字符集被用于G3.

ESC $ FESC $ ( F｜1B 24 F1B 24 28 F｜GZDM4｜G0-designate multibyte 94-set｜F选择一个94n个码位的字符集被用于G0.

ESC $ ) F｜1B 24 29 F｜G1DM4｜G1-designate multibyte 94-set｜F选择一个94n个码位的字符集被用于G1.

ESC $、F｜1B 24 2A F｜G2DM4｜G2-designate multibyte 94-set｜F选择一个94n个码位的字符集被用于G2.

ESC $ + F｜1B 24 2B F｜G3DM4｜G3-designate multibyte 94-set｜F选择一个94n个码位的字符集被用于G3.

ESC $ - F｜1B 24 2D F｜G1DM6｜G1-designate multibyte 96-set｜F选择一个96n个码位的字符集被用于G1.

ESC $ . F｜1B 24 2E F｜G2DM6｜G2-designate multibyte 96-set｜F选择一个96n-个码位的字符集被用于G2.

ESC $ / F｜1B 24 2F F｜G3DM6｜G3-designate multibyte 96-set｜F选择一个96n个码位的字符集被用于G3.

F字节的登记对于不同类型的字符集是独立的。使用`ESC ( A`到`ESC + A`指派的94个字符的图形字符集不相关于使用`ESC - A`到`ESC / A`指派的96个字符的图形字符集。二者也不相干于使用`ESC $ ( A` 到`ESC $ + A`指派的94n个字符的字符集，等等。

C0与C1控制字符集也是独立的。C0控制字符集用`ESC ! A`指代，与用`ESC " A`指代的控制字符集C1无关。

此外，I字节可增加到F字节前面以扩展F字节范围。这仅用于94个字符的字符集，它的码的形式已经使用了`ESC ( ! ''F''`。

## 遵从ISO 2022的字符集

以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第七字面

## 参考文献

- 小林剑，（1999年）. CJKV Information Processing. First Edition. O'Reilly and Associates, Inc. ISBN 1-56592-224-7；中文版，郑褚璋译，（2002年）中日韩越资讯处理 第一版，台北市，美商欧莱礼股份有限公司。ISBN 986-7794-03-6

## 外部链接

- 国际标准化组织
- ECMA-35
- 中国国家标准（中华民国）CNS 7654
- International Register of Coded Character Sets to be Used with Escape Sequences
- RFC 1468, ISO-2022-JP的规格
- RFC 2237, ISO-2022-JP-1的规格
- RFC 1554, ISO-2022-JP-2的规格
- RFC 1922, ISO-2022-CN及ISO-2022-CN-EXT的规格
- RFC 1557, ISO-2022-KR的规格
- History of Character Codes in North America, Europe, and East Asia
- CJK.INF: a document on encoding Chinese, Japanese, and Korean (CJK) languages, including a discussion of the various variants of ISO 2022。可透过 HTTP浏览。