Bear's House |
認識中文字元碼 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
三、多位元組延伸編碼前文中提到「特定字元集編碼所需最小位數的二進碼稱為位元組」,這句話似乎可以引伸為「位元組的長度(即位元數)可因字元集的大小(即字元總數)不同而做彈性的選擇」,理論上沒錯,但實務上卻很難做到。由於ASCII的強勢主導地位,使得現代的電腦主機和通訊設備,原則上都是以七位元或八位元的位元組做為處理或傳輸文數字資訊的基本單位。 七個位元的編碼空間,依據ISO/IEC 646的規定應劃分為94個圖形字元碼、空格字元碼和33個控制字元碼。而八個位元的編碼空間,則可按照ISO/IEC 8859的規定劃分為190個圖形字元碼、空格字元碼以及65個控制字元碼。或是採取第二章所述延伸ASCII的做法,把33個控制字元碼和空格字元碼之外的222個 碼位,全數做為圖形字元碼。針對絕大多數表音文字(例如:英文、俄文等)的字元集,由於它們的字母大多僅有數十個,七個或八個位元的單位元組就足以因應編碼所需。但是就表意文字(例如:中文字、日韓漢字等)的字元集而言,其圖形字元至少數以千計、甚至多達數萬,一個位元組(七或八個位元)所能提供的 碼位,顯然絕不足以因應編碼所需,必須採取多位元組延伸編碼以解決問題。國際標準ISO/IEC 2022(Information processing - 7-bit and 8-bit coded character sets - Code extension techniques)即是主要用以規範多位元組編碼結構。
(一)ISO/IEC 2022的字元碼格式不同於ASCII或ISO/IEC 646的做法,ISO/IEC 2022並不直接定義任何字元集和字元碼,而只是規定延伸編碼結構,包括:多重字元集的編碼,以及切換字元集與字元碼的方式。在ISO/IEC 2022的延伸編碼結構中,可依字元集的大小選定其字元碼為單位元組或多位元組,而每一個位元組則可選擇為七個或八個位元。 在七位元環境下【註1】,ISO/IEC 2022將每個位元組的編碼空間,做兩種不同方式的劃分:94個圖形字元碼(21h至7Eh)和34個控制字元碼(00h至20h,加上7Fh),或是96個圖形字元(20h至7Fh)和32個控制碼(00h至20h)。針對某一個任意的字元集,ISO/IEC 2022規定:該字元集的七位元多位元組圖形字元碼,必須完全由兩或多個的94圖形字元碼(21h至7Eh),或是完全由兩或多個的96圖形字元碼(20h至7Fh)所組成,兩者不得彼此混和使用,更不可以夾雜任何控制碼。例如,“4Ah 7Fh”可能是不合法的字元碼,如果第一個位元組“4Ah”是屬於94圖形字元碼,而第二個位元組“7Fh”卻是屬於96圖形字元碼的話;至於“4Ah 18h”則確定為不合法的字元碼,因為第二個位元組“18h”為控制碼。因此,單位元組字元碼可提供94(或96)個圖形字元 碼位,雙位元組字元碼可提供94×94=8,836(或96×96=9,216)個圖形字元碼位,三位元組字元碼則可提供94×94×94=830,584(或96×96×96=884,736)個圖形字元 碼位,依此類推。 就八位元環境而言,ISO/IEC 2022先將每個位元組的編碼空間區分成左、右兩個編碼子空間:左編碼子空間為碼位00h到7Fh(即b8固定為“0”),右編碼子空間為碼位80h至FFh(即b8固定為1)。每個編碼子空間再分別比照七位元方式,劃分圖形字元碼和個控制字元碼,如圖3-1所示。針對某個任意字元集,ISO/IEC 2022限制:該字元集的八位元多位元組圖形字元碼,必須依循前述七位元的規定(即圖形字元碼必須完全由兩或多個的94圖形字元碼,或是由兩或多個的96圖形字元碼所組成)。並且限制:每個字元碼裡的所有位元組的b8必須都設為“0”或是都設為“1”(即必須是屬於同一個編碼子空間)。例如,“3Dh B9h”就是個不合法的字元碼,因為前一個位元組“3Dh”的b8為0而後一個位元組“B9h”的b8為1。因此,單位元組字元碼可提供94+94=188(或96+96=192)個圖形字元 碼位;雙位元組字元碼只能提供94×94+94×94=17,672(或96×96+96×96=18,432)個圖形字元碼位,而非188×188(或192×192)個圖形字元 碼位;三位元組字元碼只可以提供94×94×94+94×94×94=1,661,168(或96×96×96+96×96×96=1,769,472)個圖形字元碼位,而不是188×188×188(或192×192×192)個圖形字元 碼位;依此類推。換言之,就ISO/IEC 2022所規定的延伸編碼而言,不論字元碼的長度是多少個位元組,八個位元的位元組所能提供的碼位,其實只有兩倍於七個位元的位元組所能提供的,而非2N倍(N為位元組數)。
圖3-1 ISO/IEC 2022的八位元編碼空間劃分
(二)ISO/IEC 2022的字元碼延伸編碼結構ISO/IEC 2022的圖形字元碼延伸編碼結構(如圖3-2所示),由三部份所構成:
圖3-2 ISO/IEC 2022的圖形字元碼延伸編碼結構 在圖3-2的結構下,ISO/IEC 2022規定電腦必須先利用逸出順序(escape sequence)控制符從圖形字元集庫裡將最多四個圖形字元集分別載入備用字元集區。然後再藉由調用(invocation)控制符,從四個備用字元集G0、G1、G2和G3當中挑選其一,載入現用字元集區,讓電腦可據以處理文數字資訊或顯示字元圖形。每個圖形字元集及其字元碼都必須賦予特定的逸出順序控制符,並需先向ISO登記註冊,以便個別電腦之間能有共同遵循的依據,而不至於將字元碼對應到錯誤的字元集。但如果一群電腦共同使用不超過四個的圖形字元集,則可經由彼此約定,將這些字元集分別預設為G0、G1、G2和G3,因而可省略逸出順序控制符。 圖3-3所示為ISO/IEC 2022所規定,供單位元組圖形字元碼選用的三位元組逸出順序控制符,以及供多位元組圖形字元碼選用的四位元組逸出順序控制符。這些逸出順序控制符裡的終結字元[F],其字元碼依規定必須是從30h至7Eh的七位元碼,共計79個字元。而每個終結字元碼可用以指定一個圖形字元集和字元碼,因此共計可用以指定553個單位元組和553個多位元組的圖形字元集和字元碼。【註2】除此之外,ISO/IEC 2022還規定有了多位元組圖形字元碼選用的三位元組和超過四位元組的逸出順序控制符。
圖3-3 ISO/IEC 2022的部份逸出順序控制符 圖3-4所示為ISO/IEC 2022所規定的調用控制符名稱及字元碼串,其中部份字元碼串領頭的“ESC”為ISO/IEC 646控制字元(字元碼1Bh)。針對七位元環境,ISO/IEC 2022定義了四個鎖定移位和兩個單一移位的調用控制符。針對八位元的環境,ISO/IEC 2022則定義了七個鎖定移位和兩個單一移位的的調用控制符。備用圖形字元集(G0、G1、G2和G3)四者之一,一旦以對應的鎖定移位(locking-shift)調用控制符載入現用字元集區之後,就會成為常駐字元集。若要將現用圖形字元集切換為另一個備用字元集,必須再藉助對應的鎖定移位調用控制符,重新將目標字元集載入現用圖形字元集區。至於單一移位(single-shift)調用控制符則只對緊跟其後的一個字元碼發生作用。換言之,當電腦遇有單一移位調用控制符時,就會將緊跟於控制符之後的一個字元碼,當做該調用控制符所指定的備用圖形字元集裡的某個字元而加以處理或顯示。但再下一個字元碼,則恢復為適用現用字元集。
圖3-4 ISO/IEC 2022的調用控制符 適用於七位元環境的四個鎖定移位和兩個單一移位調用控制符,其作用如下:
適用於八位元環境的七個鎖定移位和兩個單一移位調用控制符,其作用如下:
註1:七位元環境意指在電腦或通訊設備裡,每一個位元組都被預先設定為七個位元。 註2:單位元組字元集(碼)包括94圖形字元式字元集四組、96圖形字元式字元集三組,共計七組,每組79套字元集,79×7=553。多位元組字元集(碼)的情況亦同。
|