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瀏覽。