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 字元，但這可被控制碼或早先的協定修改：

四個工作集的每個可表示 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_ 位元組辨識字元集自身。

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

## 參看

* 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（頁面存檔備份，存於網際網路檔案館）瀏覽。