Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5359416
  • 博文数量: 1144
  • 博客积分: 11974
  • 博客等级: 上将
  • 技术积分: 12312
  • 用 户 组: 普通用户
  • 注册时间: 2005-04-13 20:06
文章存档

2017年(2)

2016年(14)

2015年(10)

2014年(28)

2013年(23)

2012年(29)

2011年(53)

2010年(86)

2009年(83)

2008年(43)

2007年(153)

2006年(575)

2005年(45)

分类: LINUX

2005-05-01 11:45:08

 : 關於 Unicode 的文章; 以及 Big5e 編碼
發表人 貼於 2002/11/20 0:00:00 (3108 人讀取)
程式語言

Unicode 在未來可能越來越重要, 資訊人不可不知....
我找到一篇中研院的通訊, 有提到 utf-16 及 utf-8.
文章出處: 中央研究院計算中心通訊


另外, Big5e 也是最近很重要的論點, 由 statue 先生寫的這篇文章十分受用. 介紹給您!







《資訊話題》

Unicode與ISO10646(上)(作者:曾士熊)

一、緣起

1960年代初期,美國國會圖書館(Library of Congress, LC)的
Henriette Avram等人開始研擬機讀編目格式,同時James Agenboard
等人也制訂了英文的字元集和交換碼,以做為美國圖書館界書目交
換的共同標準。LC交換碼隨後發展成為美國的國家標準ASCII(American
Standard Codefor Information Interchange),而且還進一步演
變成世界性的電腦字元編碼標準ISO646(其全名為7-bit coded
character set for information interchange)。時至今日,雖然
一個位元組(byte)的長度已經從7個位元(bit)增加為8個位元,
ASCII和ISO646 仍然是電腦與網路世界裡要的奠基標準。

依ASCII和ISO646的規定,7個位元所能提供的128個編碼位置(編
碼範圍為0~127)被區分為兩部分:94個圖形字元碼和34個控制字
元碼。圖形字元包括52個大小寫英文字母﹑10個阿拉伯數字﹑9個標
點符號﹑6個括號,以及17個其它符號,編碼範圍從33到126。控制
字元則包括10個傳輸控制字元、6個版面調整字元、4個設備控制字
元、 4個資訊分隔字元和10個特殊控制字元,其編碼為0~32和127。
當電腦或網路設備收到一連串的位元信號時,通常會一邊接收一邊
切分為位元組(即每8個位元一切),並且立刻分辨剛收到的位元
組究竟是控制字元碼還是圖形字元碼。若是屬收訊設備相關的控制
字元時(例如傳輸控制、編碼為7的BELL等字元),當電腦或網路
設備會截留該字元並立即做出對應動作(例如BELL字元會驅使收訊
設備叫一聲),否則不予處理而傳送給後續設備。換言之,電腦和
網路設備會吃掉位元串裡的特定控制字元碼。

隨著電腦弁鄋漱橧舠j大與價格的日趨便宜,其應用領域也越來
越廣。但是隨之而來的各種編碼需求,卻使得單一位元組的編碼方
式,因編碼空間太小,變得不足以因應各種應用程式的需求。中文
字、排版系統的標誌符號、非英語拼音字母和圖形符號等的編碼,
需要使用2或多個位元組來編碼。同時,為了預防這些多位元組字元
碼被電腦或網路設備「吃掉」其中的某個位元組,編碼時必須避開
每個位元組的0~32和127這34個控制碼。這種做法嚴重浪費編碼空
間,就多位元組擴充編碼的國際標準ISO2022而言,兩個8位元的位
元組只能提供最多188個控制字元和35,344個文字形符號的編碼空間,
共計35,532個編碼位置,但是16個位元的編碼空間事實上高達65,536。
兩者相比較,ISO2022的16位元編碼只能達到最大編碼空間的54%,
顯得利用率很差。同時在應用層次的編碼,由於廠商眾多又缺乏共
識,往往你編你的碼、我編我的碼,其後果則是引發萬碼奔騰的亂
象。

為容納全世界各種語言的字元和符號,ISO的一些會員國於1984年
發起制定新的國際字元集編碼標準。新標準由工作小組ISO/IEC
JTC1/SC2/WG2(註1)負責擬訂(以下簡稱WG2),最後定案的標準
命名為“Universal Multiple-Octet Coded Character Set”
(簡稱UCS),其編號則訂為ISO/IEC 10646。依WG2原來的規劃,
ISO10646的編碼結構係沿襲ISO2022八位元延伸編碼結構以避開C0和
C1兩個控制碼區(註2),但打破每個字元碼裡的所有位元組的bit-8
(即最左邊的位元,其值為28=128)必須都設為0或是都設為1的限制,
以提高編碼空間的使用率。同時,為了能有足夠位置以容納全世界各
種語言的字元和符號,以及為了配合微處理器以8、16、32甚或64個
位元為一個咚闾幚韱挝坏内厔荩琁SO10646的字元碼長度被規定為
定長的4個八位元(octet)。

ISO10646草案初稿一經公佈,其編碼結構立即遭到美國部份電腦
業者的反對。1988年初,美國Xerox公司的Joe Becker倡議以新的編
碼結構,另外編訂世界性字元編碼標準:將電腦字元集編碼的基本
單位由現行的7或8個位元一舉擴充為16個位元,並且充分利用65,536
個編碼位置以容納全世界各種語言的字元和常用符號。新的字元集
編碼標準被命名為“Unicode”(註3)。一群來自Xerox公司和Apple
公司的工程師組成工作小組,負責Unicode的原始設計工作。1991年
元月,十多家電腦硬軟體、網路和資訊服務業者,包括:IBM、DEC、
Sun、Xerox、Apple、MicroSoft、Novell名公司,共同出資成立
Unicode協會(The Unicode Consortium),並由協會設立非營利的
Unicode公司。Unicode協會成立之後,將原先的工作小組擴編為
Unicode技術委員會(Unicode Technical Committee),專責Unicode
的字元搜集、整理、編碼等工作。推動Unicode成為國際標準的工作,
則由Unicode公司負責。Unicode草案第一版於1989年9月發表,歷經
多次修訂後,分別於1991、92年出版了Unicode標準第一版(The
Unicode Standard, version 1.0)的第一、第二冊。

由於Unicode協會持續的遊說和施壓,WG2終於放棄原先選擇的ISO2022
八位元延伸編碼結構,改採Unicode的編碼方式,亦即連續編碼不再避開
C0和C1控制碼區。1991年10月,歷經幾個月的協商之後,WG2和Unicode
協會達成協議,將Unicode併入ISO10646成為第0字面。之後各國語言字
元的搜集、整理和編碼等工作轉由WG2主導,而Unicode協會則積極協助
WG2,但雙方仍然各自出版自己的編碼標準。由於雙方標準的整合是在
Unicode標準第一版第一冊出版之後才展開的,因此該版次標準的第二
冊特別在第一章裡說明了為因應合併工作所做的編碼區和字元集修訂項
目。ISO於199月出版ISO10646-1(註4)的第一版,而第二版則經過多年
修訂之後於今年3月出版。介於ISO10646-1第一、二版之間的Unicode標
準第二版於1996年出版,而對應於ISO10646-1第二版的Unicode標準第三
版於今年一月出版。今年三月,在北京舉行的WG2第38次會議正式通過
ISO10646-2(註5)最終草案,預定五月底編輯完成後送交各會員國審
查,如無意外,明後年將會正式出版。

二、編碼結構與字元集

ISO10646字元碼的正規形式(可簡稱為UCS-4)為32個位元,劃分
成4個八位元,如【圖一】所示。這4個八位元,由左而右命名為群
八位元(G-octet)、面八位元(P-octet)、列八位元(R-octet)
和格八位元(C-octet),分別代表編碼結構中的群組(group)、
字面(plane)、列(row)與格(cell)。ISO10646規定其字元碼
的b32必須為0,因而整個編碼空間可區分為128個群組(群八位元
的值為00~7Fh(註6)),每一群組由256個字面所組成(面八位
元為00~FFh),每一個字面由256列所組成(列八位元為00~FFh),
每一列則包含256格(格八位元為00~FFh),為一個編碼位置。除
此之外,ISO10646還規定每一個字面的最後兩個編碼位置FFFEh和
FFFFh,保留不用。所以,ISO10646整個編碼空間總共256×128=
32,768個字面,每個字面為256×256-2=65,534個編碼位置,合
計65534×32768=2,147,418,112個編碼位置。

ISO10646的第0群組第0字面(群八位元和面八位元的值都為00h)
稱為「基本多語文字面」(Basic Multi-lingual Plane, BMP),
其編碼字元與Unicode相同。BMP之外的32,767個字面區分為輔助字
面(supplementary planes)和專用字面(private use planes)。
輔助字面用以收容WG2陸續收集、整理和編碼的各國語文字元;專
用字面的內容WG2不予規定,保留供使用者自行添加ISO10646未收
容的字元。專用字面共8,226個,包括00h群組的0Fh、10h和E0~
FFh共計34個字面,以及60~7Fh共32個群組的8,192個字面。除了
這8,226個專用字面之外,其餘的24,541個字面都是輔助字面。
當電腦系統只使用BMP的字元碼時,可以省略群八位元和面八位
元,因而而將字元碼由32個位元縮短為16個位元,稱為ISO10646
字元碼的基本面形式(可簡稱為UCS-2),其實也可視同於Unicode。

ISO10646所有字面中,目前僅有第0、第1和第2字面真正收容
編碼字元。ISO10646的BMP和Unicode的編碼字元,依其UCS-2編
碼序介紹如下:

(1)0000~007Fh:基本拉丁字母區。其中0000~001Fh為C0控
制碼,0020h為空格(space),0021~007Eh為ASCII圖形
字元,007Fh為控制碼DEL。事實上,這128個字元碼只要
把前8個位元去掉就可變成習見的8位元形式的ASCII碼。

(2)0080~00A0h:控制碼區。其中0080~009Fh為C1控制碼,
00A0h為不中斷空格(no-break space)。

(3)00A1~1FFFh:拼音文字區。收容除基本拉丁字母以外的各種
拼音文字字元,包括歐洲各國語言、希臘文、斯拉夫語文、
希伯來文、阿拉伯文、亞美尼亞文、印度各地方言、馬來文、
泰文、寮文、柬普寨文、滿文、蒙文、藏文、印地安語文等。

(4)2000~28FFh:符號區。收容各種符號,包括標點符號、上下
標、錢幣符號、數字、箭頭、數學符號、工程符號、光學辨
識符號、帶圈或帶括符的文數字、表格繪製符號、地理圖示、
盲用點字、裝飾圖形等。

(5)2E80~33FFh:中日韓符號區。收容康熙字典部首、中日韓輔
助部首、注音符號、日本假名、韓文音符,中日韓的符號、
標點、帶圈或帶括符文數字、月份,以及日本的假名組合、
單位、年號、月份、日期、時間等。

(6)3400~4DFFh:中日韓認同表意文字擴充A區,總計收容6,582
個中日韓漢字。

(7)4E00~9FFFh:中日韓認同表意文字區,總計收容20,902個中
日韓漢字。

(8)A000~A4FFh:彝族文字區,收容中國南方彝族文字和字根。

(9)AC00~D7FFh:韓文拼音組合字區,收容以韓文音符拼成的文
字。

(10)D800~DFFFh:S區,專用於UTF-16,詳情後敘。

(11)E000~F8FFh:專用字區,其內容WG2不予規定,保留供使用
者自行添加ISO10646未收容的字元。

(12)F900~FAFFh:中日韓相容表意文字區,總計收容302個中日
韓漢字。何謂相容表意文字,留待後敘。

(13)FB00~FFFDh:文字表現形式區,收容組合拉丁文字、希伯來
文、阿拉伯文、中日韓直式標點、小符號、半形符號、全形
符號等。

WG2集各國專家之力共同整理全世界古今各種語言文字和符號,陸
續編入ISO10646。WG2依語言特性把各種文字區分為表意文字和非表
意文字兩類,表意文字其實就是東亞各國所使用發源於中國的漢字,
主要包括台灣、中國、日本、南北韓、越南、新加坡和港澳地區所使
用的漢字。除漢字之外的所有其他文字,一律歸類為非表意文字,絕
大部分為拼音文字。ISO10646的BMP和Unicode同時收編非表意文字、
符號和表意文字。但全世界古今各種語言文字和符號的數量何其龐大,
單靠BMP不足以容納。WG2截至目前為止所收集、整理的非表意文字和
符號部分,扣除已編入BMP者,其餘全部編入第1字面,由於其內容項
目過於龐雜,本文不擬介紹。而表意文字部分扣除已編入BMP者,其
餘全部編入第二字面,其內容為:

(1)中日韓認同表意文字擴充B區:總計42,807個中日韓越漢字,
編碼範圍為0002-0100~0002-A836h。

(2)CNS11643相容字元區:收容被認同的CNS11643字元527個,編
碼範圍為0002-F800~0002-FA16h。

WG2制訂ISO10646編碼字元集,首先由各會員體或觀察員收集整理
自己國家的文字和符號向WG2提案(註7),WG2每半年召開會議審查
字元集提案,通過者即予以編碼或是等候匯集更多字元集後再進行
編碼。非表意文字或符號,因為字集小或是只有某個國家使用,通
常直接在WG2會議上討論即可。但漢字字集規模龐大且為多個國家和
地區共同使用,WG2為此設置表意文字書記小組(Ideograph Rapporteur
Group, IRG)專責收集各國漢字字集,加以比對認同彙整成為整體
性字集之後再向WG2提出。IRG所建議的字元集,WG2向來都是直接
接受予以編碼。IRG各會員體所提出的漢字都源自中國,難免有些字
的字形相同或極為近似。為了避免ISO10646編碼表出現重複字造成
使用者困擾,IRG制訂了表意文字認同規則。凡是依規則應予認同的
漢字,一律合併成一字賦予一個編碼。不過為了尊重各國對各自文
字的主控權,WG2特別在ISO10646編碼表中並列同一漢字不同來源的
各自字形。

認同規則不僅哂渺墩?喜煌瑏碓吹臐h字,同時適用於相同來源
的漢字。例如,在我國中文碼國家標準CNS11643的字集裡就收編了
兩個極為相似的「圖」字,分別賦予兩個不同的碼1-6837h和6-5B5Bh,
這兩個「圖」字,依認同規則必須合併為一個,於是後者被前者認
同掉了。詳言之,CNS的1-6837h和6-5B5Bh都對應到Unicode的5716h
(或ISO10646的0000-5716h),但是Unicode的5716h卻只對應到CNS
的1-6837h。當我們把資料從CNS碼轉換成Unicode,再由Unicode轉回
CNS碼時,將發生6-5B5Bh→5716h→1-6837h的結果,這種現象稱為去
回轉碼(round-trip conversion)錯誤。解決之道無他,必須在
Unicode或ISO10646字集中多加上被認同掉的字元並另外賦予編碼
(稱為相容字元),做到CNS字集與ISO10646字集一對一(但不必
也無法做到映成)。ISO10646第2字面所收容的CNS相容字集,就是
我國為了達到正確去回轉碼的目的,經多年力爭所得成果。換言之,
CNS11643現有中文字集已全數編入ISO10646編碼表中。
      (下期待續)

參考資料:

註1:ISO為國際標準組織(International Organization for
Standardization)的英文縮寫;IEC為聯合國下屬國際電
氣技術委員會(International Electro-technical
Commission)的英文縮寫;JTC1係由ISO和IEC雙方協議共
組的第一聯合技術委員會(Join Technical Committee One),
負責制訂與資訊處理、資訊技術相關的國際標準;JTC1/SC2
為設於JTC1之下的第二分組委員會(Sub-Committee Two);
而JTC1/SC2/WG2則是JTC1/SC2之下的第二工作組(Working
Group Two)。在我國,經濟部標準檢驗局設有對應ISO/IEC
JTC1/SC2的組織,稱為資訊及通信國家標準起草委員會,
而對應ISO/IEC JTC1/SC2/WG2者,稱為中文資訊標準分組
委員會。筆者同時擔任這兩個組織的委員。

註2:C0控制碼區指的是編碼為0~31的32個控制碼(其bit-8為0),
而C1控制碼區則是意指128~159的32個控制碼(其bit-8為1)。
關於C0和C1控制碼詳情,請參考ISO6429或CNS13479。

註3:國內有人將Unicode譯為「統一碼」。

註4:ISO10646-1為該標準的第一部份,正式名稱為“ISO/IEC 10646-1:
Universal Multiple-Octet Coded Character Set - UCS - Part 1:
Architecture and Basic Multilingual Plane (BMP)”,其
內容僅及於ISO10646的編碼結構和第0字面的編碼表。

註5:ISO10646-2為該標準的第二部份,正式名稱為“ISO/IEC 10646-2:
Universal Multiple-Octet Coded Character Set - UCS - Part 2:
CJK Unified Ideographs Supplementary Plane, General Scriptsand
Symbols Plane, General Purpose Plane”,其內容主要包括
第1字面非表意文字、符號的編碼表,以及第2字面中日韓認同
表意文字和相容表意文字的編碼表。

註6:在此,h表示16進制數字,每一數位的值為0~15,分別表示
為0~9和 A(10)、B(11)、C(12)、E(13)、D(14)和F(15)。

註7:我國為WG2的觀察員和IRG的會員體,本文作者目前為這兩個
組織的我國代表。


=========================================

《資訊話題》

Unicode與ISO10646(下)(作者:曾士熊)

(續1510期)

三、UTF-16與UTF-8

ISO10646的編碼空間足以容納古今人類使用過的所有文字和符號,
但目前真正被使用的文字或符號,絕大多數都已編入BMP,它們的使
用頻率可能超過99%,甚至99.99%。換言之,就99%以上的使用者或
使用場合而言,16位元的Unicode已是足敷需求,32位元的ISO10646
正規編碼則顯得割雞用牛刀。32位元編碼不只要比16位元編碼佔用
多一倍的記憶或儲存空間,而且在網路傳輸和資訊處理上也需花費
比較長的時間。就經濟效益而言,將來電腦和網路選擇使用Unicode
的可能性,很明顯地要高於選擇使用32位元的ISO10646正規編碼。
問題是,在Unicode的世界裡,遇到必須使用646第1、第2字面甚至
更後方字面的字元時,怎麼辦?Unicode協會提出的解決方式稱為
UTF-16或代理法(surrogates)。 UTF為“a UCS(or Unicode)
Transformation Format”的縮寫,UTF-16意即把原為32位元的
ISO10646字元碼轉換為2或多個16位元的Unicode。目前的作法是組
合兩個Unicode字元碼來代表一個ISO10646字元,如【圖二】所示,
所以又稱為代表法。兩個做為代表的Unicode,位於前方(左方)
者稱為高半字元,限定只能選用D800~DBFFh當中之一,位於後方
(右方)者稱為低半字元,限制只可從DC00~DFFFh當中選擇。高
低半字元的編碼位置各為1,024=4×256,因此UTF-16總計可提供
(4×256)×(4×256)=16×65536個編碼位置,亦即16個字面。
對BMP而言,當然無需使用UTF-16轉碼,所以UTF-16主要應用於
ISO10646的第1~第14字面(因為第15字面為專用字面,WG2不予編
碼)。將ISO10646字元(編碼範圍0001-0000~000E-FFFFh)以
UFT-16轉換成Unicode組合形式的規則,如【圖三】所示,圖中為了
方便對應16進制,特別將字元碼表現成每4個位元一組,中間以短槓
分隔。轉換方式不難,將原來的32位元ISO10646字元碼,從右往左
取出10個位元(即圖中的Y10~Y1)前頭附加上特定的6個位元110111,
即成為低半字元。接著往左取出6個位元(即圖中的Y16~Y11)做為
高半字元的最低6個位元,然後再往左取出4個位元(即圖中的Z4~Z1,
相當於Y20~Y17,其值可顯示第0~第15字面),將其值減1,置於剛
才那6個位元的左方,最後在最前方附加上特定的6個位元110110,即
成為高半字元。以上所介紹的是UTF-16轉換的觀念,至於UTF-16的轉
換公式和還原公式,請詳見ISO10646標準或Unicode標準。

請特別注意,UTF-16係針對Unicode世界所設計的。也就是說,當
網際網路和大部分的電腦都已經採用Unicode了,UTF-16才可用來表
現ISO10646第1~第14字面的字元碼。很不幸的事實並非如此,現在
是ASCII世界而非Unicode世界。當某一個Unicode離開溫室(某個以
Unicode為內碼的作業系統或應用程式)之後,馬上會被網路設備切
成兩個8位元的位元組,並嚴密檢查是否有任何位元組為C0控制碼,
至少數千個Unicoe將因此變得殘缺不全。為了能讓Unicode和ISO10646
字元碼能安然通行於ASCII世界,Unicode協會特別提出UTF-8以解決
問題。UTF-8意即把原為32位元的ISO10元碼或原為16位元的Unicode
轉換為多個8位元的位元組。

利用UTF-8轉碼規則可將一個Unicode或ISO10646字元碼轉換成1~4
個位元組的編碼,如【圖四】所示。UTF-8的轉換規則很簡單:若原始
字元碼位於0000~007Fh(或0000-0000~0000-007Fh)的範圍內,則
直接截取最右8個位元即可,轉換結果其實就是ASCII碼。若原始字元
碼大於007Fh(或0000-007Fh),亦即超出ASCII範圍時,就必須轉換
成2~4個位元組。UTF-8規定,以轉換後第1位元組起頭連續設為“1”
的標記位元的數目表示轉換成幾個位元組:110表示轉換結果為2個位
元組,1110表示3個位元組,而11110則表示4個位元組。至於跟隨在標
記位元之後設為0的位元,其在分隔標記位元和字元碼位元。第2~第4
位元組起頭兩個位元被設為10當做識別,剩下的6個位元才做為字元碼
位元使用。總計,2位元組UTF-8碼剩下11個字元碼位元,可用以轉換
0080~07FFh的原始字元碼。3位元組剩下16個字元碼位元,可用以轉換
0800~FFFFh的原始字元碼。而4位元組則剩下21個字元碼位元,可用來
轉換0001-0000~001F-FFFh(即ISO10646第1~第31字面)的原始字
元碼。請注意,雖然4個位元組的UTF-8編碼可包容1~3個位元組的碼,
3個位元組的編碼可包容1~2個位元組的碼,以及2個位元組的編碼可包
容1個位元組的碼,但是UTF-8規定轉碼時必須選擇最短者。換言之,
ASCCI區只能轉換成單一位元,0080~07FFh的原始字元碼只能轉換成2
個位元組長度,依此類推。

阅读(1657) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~