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 | SI LS0 |
Shift In Locking shift zero |
GL編碼G0從現在開始 |
0x0E | SO LS1 |
Shift Out Locking shift one |
GL 編碼G1從現在開始 |
ESC 0x6E (n) | LS2 | Locking shift two | GL 編碼G2從現在開始 |
ESC 0x6F (o) | LS3 | Locking shift three | GL 編碼G3從現在開始 |
0x8E ESC 0x4E (N) |
SS2 | Single shift two | GL 編碼G2僅用於下一個字符 |
0x8F ESC 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 $ F ESC $ ( F |
1B 24 F 1B 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(頁面存檔備份,存於網際網路檔案館)瀏覽。