Bear's House |
認識中文字元碼 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
七、中文內碼概觀中文內碼係指某些種中文作業系統或應用程式所專用的中文字元碼,通常僅限於該類作業系統或應用程式使用。現有的中文內碼都是採用多位元組編碼格式,每一位元組 大多是八個位元。為因應中英文字元碼夾雜的情況,中文作業系統或應用程式必須採取某種預設的中文內碼識別機制,藉以避免將一個中文內碼誤認為多個ASCII或延伸ASCII字元碼。依中文內碼識別機制的不同,中文內碼的編碼格式可大致區分為四類:標籤識別式中文內碼、逸出順序切換式中文內碼、ASCII字元化中文內碼,以及 多語文整合式內碼。
(一)標籤識別式中文內碼在每一個中文內碼裡,指定一或多個位元或是指定某個位元組,將其設為特定值以做為識別標籤,稱為標籤識別式中文內碼。整體說來,標籤識別式中文內碼的優點是:可設計成兩個位元組或四個位元組的定長碼,方便於中文資訊的檢索。標籤識別式中文內碼,依識別標籤做法的不同,可再區分為三種型式:單位元標籤式中文內碼、多位元標籤式中文內碼,以及位元組標籤式中文內碼。 單位元標籤式中文內碼:Big5碼、TCA碼等都屬於這一型。如圖7-1所示,其編碼格式為兩個連續的位元組,依序分別命名為高位元組和低位元組,每一位元組為八個位元,只有高位元組的b8位元(亦即整個中文內碼的前導位元)被固定設為1以做為識別標籤。針對這一型中文內碼,負責識別中文內碼的程式需從頭開始依序讀取每一個位元組並檢視其b8位元。若b8=0,則將該位元組視為ASCII字元碼而加以處理。若b8=1,則將該位元組視為中文內碼的高位元組,再讀取下一個位元組做為低位元組,將高、低兩個位元組合併當做一個中文內碼予以處理。
圖7-1 單位元標籤式中文內碼 以本文標題『認識中文碼』為例,其Big5內碼為“BB78h C3D1h A4A4h A4E5h BD5Bh”,五個字元碼的高位元組“BBh”、“C3h”、“A4h”、“A4h”和“BDh”皆大於80h,亦即它們都是b8=1。但在低位元組方面,『認』的低位元組“78h”和『碼』的低位元組“5Bh”都小於80h,亦即它們都是b8=0;至於『識』的低位元組“D1h”、『中』的低位元組“A4h”和『文』的低位元組“E5h”則都是大於80h,亦即它們都是b8=1。 多位元標籤式中文內碼:GB內碼和EUC-1即屬於這一型【註:GB內碼係指將GB 2312漢字交換碼兩個位元組的前導位元b8都設為1,而做為內碼使用。】。如圖7-2所示,其編碼格式為兩或多個連續的位元組,但是做為中文內碼大多選擇只用兩個位元組,每一位元組為八個位元,而且每個位元組的b8位元都必須固定設為1以做為識別標籤。針對這一型中文內碼,負責識別中文內碼的程式需從頭開始依序讀取每一個位元組並檢視其b8位元。若b8=0,則將該位元組視為ASCII字元碼而處理之。若b8=1,則需再讀取一個b8=1的位元組(假設中文內碼長度為兩個位元組),並將兩個位元組合併當做一個中文內碼加以處理。
圖7-2 多位元標籤式中文內碼 位元組標籤式中文內碼:EUC-2和EUC-3等都屬於這一型,如圖7-3所示,其編碼格式為多個連續的位元組,但做為中文內碼大多選擇只用四個位元組,每一位元組為八個位元,其中的前導位元組B4設為特定值以做為識別標籤。換言之,在四個位元組當中,只有後三個才是實質的中文內碼。實質中文內碼每個位元組的前導位元b8也可都設為1,但非必要。圖7-3中所示係採EUC-2編碼結構的中文內碼,因此前導位元組B4的值設為EUC-2的識別標籤“10001110”(8Eh),而且將位元組B3、B2、和B1的前導位元b8也都設為1。針對這一型中文內碼,負責識別中文內碼的程式需依序讀取每一個位元組並檢視是否為識別標籤。若否,則將該位元組視為ASCII字元碼而處理之。若是,則必須再讀取三個連續的位元組(如圖中的位元組B3、B2和B1),並將此三個位元組合併當做一個中文內碼加以處理。
圖7-3 位元組標籤式中文內碼 以本文標題『認識中文碼』為例,其中文標準交換碼(即CNS 11643所規定者,英文縮寫為CSIC)為“1-6B25h 1-787Ch 1-4463h 1-4546h 1-6E23h”【註:“1-”係為表示該中文字屬CSIC第1字面而附加的,CSIC本身只有兩個位元組。】,若轉換成EUC-3式內碼UCS-CSIC,則變為“8EA1EBA5h 8EA1F8FCh 8EA1C4E3h 8EA1C5C6h 8EA1EEA3h”。依據CNS 11643附件1的規定,將CSIC轉換為EUC-CSIC的規則為:
(二)逸出順序切換式中文內碼直接以某種中文交換碼為內碼,並模仿ISO/IEC 2022以逸出順序控制符切換備用字元集的做法,在一連串的中文內碼之前插入用以從英文字集切換為中文字集的逸出順序控制符(即進入控制符),同時在此中文內碼串之後插入由中文字集切換回英文字集的逸出順序控制符(即離開控制符),如圖7-4所示。負責識別中文內碼的程式依序讀取每一個位元組,並且檢視是否為進入控制符。若否,則將該位元組視為ASCII予以處理。若是,則立即切換為中文狀態,並將隨後的所有位元組都以中文內碼處理之,直到遇有離開控制符才回復英文狀態。 只有早期的ZWDOS採用這種編碼格式的中文內碼,所選用中文碼為GB 2312,進入控制符定為兩個ASCII符號“~{”,離開控制符則定為“~}”。逸出順序切換式中文內碼,因可採用七個位元的位元組,所以便於網路傳輸。但採用逸出順序控制符卻使得中文內碼變成非定長碼,較不利於資訊檢索。此外,多位元組形式的進入和離開控制符需多次判斷方可確認,以及進入中文狀態後仍須逐位元組檢測離開控制符,都使得逸出順序切換式中文內碼的識別程序較為複雜。【註:ZWDOS為大陸留美學人魏亞桂多年前所開發的中文系統,ZW為『中文』一詞漢語拼音“zhong-wen”的縮寫,其功用有如倚天中文系統,為微軟的DOS作業系統增添中文輸入與輸出功能。】
圖7-4 逸出順序切換式中文內碼格式
(三)ASCII字元化中文內碼針對中文碼的十進制或十六進制數值,將每一數位(相當於四或三個位元)都轉換為對應的ASCII碼(稱為ASCII式中文內碼),並在每一個中文內碼之前附加起始識別符,並視需要在每個ASCII式中文內碼之後附加分隔符或結束識別符,如圖7-5所示。ASCII式中文內碼的數位轉換規則:若數位的值為0到9,則轉換成阿拉伯數字“0”到“9”(ASCII碼為30h至39h);若數位的值為10至15,則轉換成英文大寫字母“A”到“F”(ASCII碼為41h到46h)。針對這一類中文內碼,負責識別中文內碼的程式需依序讀取每一個位元組並檢視是否為起始識別符。若否,則將該位元組視為ASCII字元碼而處理之。若是,則必須再連續讀位元組直到遇見分隔符或結束識別符為止,而後將所讀取的連續幾個位元組組合成為一個中文內碼並加以處理。
圖7-5 ASCII字元化中文內碼格式 HTML文件有時採用ASCII字元化字元碼來表現非ASCII字元,以便HTML文件可通行無阻於網際網路而不受某些網路節點只能通行七位元位元組資料流(data stream)的影響(稱為網路透通性)。只要先在HTML文件的標頭部分宣告字元集名稱,即可用“&xddddd;”的格式將字元碼的十六進制數值以ASCII形式表示,或是以“&ddddd;”或“&#ddddd;”的格式將字元碼的十進制數值以ASCII形式表示。在此“&x”為ASCII式十六進制字元碼的起始識別符、“&”和“&#”為ASCII式十進制字元碼的起始識別符,而“;”則為ASCII式字元碼的結束識別符。 若要將本文標題『認識中文碼』在HTML文件中表現為ASCII式字元碼,需先在HTML文件的標頭部分以“ charset=big5”宣告字元集名稱。『認識中文碼』的Big5內碼“BB78h C3D1h A4A4h A4E5h BD5Bh”, 其ASCII式十六進制字元碼則顯示為『&xBB78; &xC3D1; &xA4A4; &xA4E5; &xBD5B;』,而 其ASCII式十進制字元碼顯示為『뭸 쏑 ꒤ ꓥ 뵘』。請注意,在此『』所包夾的是螢幕上所顯示的字元,而“”所包夾的則是電腦內部的字元碼。例如,螢幕上所顯示的『認』字,在電腦中的兩個位元組Big5字元碼為十六進數“BB 78”,但轉換成ASCII式十六進制字元碼之後,雖然顯示『BB78』,但在電腦中字元碼的則變成四個位元組的十六進數“42 42 37 38”。再加上兩個位元組的起始識別符『&x』(ASCII碼為十六進數“26 78”)和一個位元組的結束識別符『;』(ASCII碼為十六進數“3B”),總共為七個位元組。 所以ASCII字元化內碼比直接使用內碼大幅增加檔案大小,這是為了網路透通性所需付出的代價。
(四)多語文整合式內碼顧名思義,多語言整合式內碼指的是將兩或多種語文的字元集整合在同一套內碼裡,例如EUC16(如圖4-2所示)和EUC32(如圖4-3所示)、UCS2和UCS4等都屬於這一類編碼型式。UCS2和UCS4即Unicode和ISO/IEC 106464,留待第十一章再行介紹。 主流的中文電腦係採Big5中文碼配合ASCII。因為Big5的中文字集其實是取自CSIC第一字面的常用中文字集和第二字面的次常用中文字集,因此我們可另外設計一套EUC16-CSIC內碼使其字元集與現行Big5+ASCII相同。EUC16-CSIC係將ASCII和CSIC第一、第二字面的字集整合成一套內碼, 做法上可以把ASCII安排於EUC16-0、將CSIC第一字面安排於EUC16-1、將CSIC第二字面安排於EUC16-2,而EUC16-3則留做使用者造字區。以本文標題『認識中文碼』的CSIC碼“1-6B25h 1-787Ch 1-4463h 1-4546h 1-6E23h”為例, 其EUC16內碼將變成“EBA5h F8FCh C4E3h C5C6h EEA3h”。另以『CSIC』的ASCII碼“43h 53h 49h 43h”為例,其EUC16內碼將變成“0043h 0053h 0049h 0043h”。 EUC16-CSIC和Big5+ASCII兩者相比,前者的優點要多於後者:
可惜EUC要比Big5晚了大約六年,當EUC編碼結構問世時,Big5早已壟斷了台灣的中文電腦世界,即使EUC16-CSIC優於Big5+ASCII,也已經無力回天了。至於EUC32雖然其字元碼為四個位元組和EUC16的兩個位元組不同,但它們的設計理念相近,不再贅述。
(五)字元碼競合現象網友們瀏覽大陸網站或日本網站時,偶而會發現某些網頁呈現無法閱讀的亂碼,這就是字元碼競合現象。所謂字元碼競合現象,意指同一個字元碼串分別由幾個使用不同字元編碼的 中文作業系統或應用程式處理時,因為個別系統都是以各自的預設字元集和編碼來解譯該字串裡的字元碼,所以會顯示或列印出不同的字形。例如,遇有內文為GB2312字元碼卻未在標頭註明“ charset=gb2312”的HTML檔案時,瀏覽器(例如Internet Explorer)往往以預設的Big5字元碼來解譯HTML檔案中的字元碼,於是螢幕上出現無法閱讀的「亂碼」。嚴格說來,其實這並不是亂碼,而是瀏覽器將GB內碼都當成Big5予以顯示的結果。 上述的各種中文內碼當中,位元組標籤式中文內碼、逸出順序切換式中文內碼和ASCII字元化中文內碼三者避免字元競合現象的能力都相當不錯。只要資料本身能夠避免使用做為位元組標籤、進入控制符、離開控制符、起始識別符和結束識別符的特定字元或字元組合,就不會發生字元競合現象。至於單或多位元標籤式中文內碼,是不會跟ASCII發生字元碼競合現象,但是它們的編碼格式由於和延伸ASCII的編碼格式相同,無從區別,因此雙方之間的字元碼競合現象也就必然會發生。
|