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用来：
在一种字符编码下表示属于多个字符集的字符；
表示大字符集；
兼容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标准来编码的字集包括：

 - 日语文字
ESC ( B  转为ASCII
ESC ( J  转为JIS X 0201-1976
ESC $ @  转为JIS X 0208-1978
ESC $ B  转为JIS X 0208-1983

 - 于ISO-2022-JP的基础上，加上以下一组逃逸字串
ESC $ ( D 转为JIS X 0212-1990

 - 于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的基础上，加上以下两组逃逸字串
ESC $ ( O 转为JIS X 0213-2000第一字面
ESC $ ( P 转为JIS X 0213-2000第二字面

 - 于ISO-2022-JP-3的基础上，加上以下一组逃逸字串
ESC $ ( Q 转为JIS X 0213-2004第一字面

 - 朝鲜文
ESC $ ) C 转为KS X 1001-1992

 - 中文
ESC $ ) A 转为GB 2312-1980
ESC $ ) G 转为CNS 11643-1992第一字面
ESC $ * H 转为CNS 11643-1992第二字面

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

 参看 
 EUC
 国际标准化组织 (ISO)

 参考文献 
小林劍，（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浏览。

Category:字符集
Category:Ecma標準
#02022