本頁使用了標題或全文手工轉換

Unicode

維基百科,自由的百科全書
跳到: 導覽搜尋
Unicode標誌

Unicode中文萬國碼國際碼統一碼單一碼)是電腦科學領域裏的一項業界標準。它對世界上大部分的文字系統進行了整理、編碼,使得電腦可以用更為簡單的方式來呈現和處理文字。

Unicode伴隨着通用字符集的標準而發展,同時也以書本的形式[1]對外發表。Unicode至今仍在不斷增修,每個新版本都加入更多新的字符。目前最新的版本為7.0.0,已收入超過十萬個字符(第十萬個字符在2005年獲採納)。Unicode涵蓋的數據除了視覺上的字形、編碼方法、標準的字符編碼外,還包含了字符特性,如大小寫字母。

Unicode發展由非營利機構統一碼聯盟負責,該機構致力於讓Unicode方案取代既有的字符編碼方案。因為既有的方案往往空間非常有限,亦不適用於多語環境。

Unicode備受認可,並廣泛地應用於電腦軟件的國際化與本地化過程。有很多新科技,如可延伸標示語言Java程式語言以及現代的作業系統,都採用Unicode編碼。

起源與發展[編輯]

Unicode是為了解決傳統的字元編碼方案的侷限而產生的,例如ISO 8859-1所定義的字元雖然在不同的國家中廣泛地使用,可是在不同國家間卻經常出現不相容的情況。很多傳統的編碼方式都有一個共同的問題,即容許電腦處理雙語環境(通常使用拉丁字母以及其本地語言),但卻無法同時支援多語言環境(指可同時處理多種語言混合的情況)。

Unicode編碼包含了不同寫法的字,如「ɑa」、「強/强」、「戶/户/戸」。然而在漢字方面引起了一字多形的認定爭議(詳見中日韓統一表意文字主題)。

在文字處理方面,統一碼為每一個字符而非字形定義唯一的代碼(即一個整數)。換句話說,統一碼以一種抽象的方式(即數字)來處理字符,並將視覺上的演繹工作(例如字體大小、外觀形狀、字體形態、文體等)留給其他軟件來處理,例如網頁瀏覽器或是文字處理器。

目前,幾乎所有電腦系統都支援基本拉丁字母,並各自支援不同的其他編碼方式。Unicode為了和它們相互相容,其首256字元保留給ISO 8859-1所定義的字元,使既有的西歐語系文字的轉換不需特別考量;並且把大量相同的字元重複編到不同的字元碼中去,使得舊有紛雜的編碼方式得以和Unicode編碼間互相直接轉換,而不會遺失任何資訊。舉例來說,全形格式區段包含了主要的拉丁字母的全形格式,在中文、日文、以及韓文字形當中,這些字元以全形的方式來呈現,而不以常見的半形形式顯示,這對豎排文字和等寬排列文字有重要作用。

在表示一個Unicode的字元時,通常會用「U+」然後緊接着一組十六進位的數字來表示這一個字元。在基本多文種平面(英文:Basic Multilingual Plane,簡寫BMP。又稱為「零號平面」、plane 0)裏的所有字元,要用四位十六進制數(例如U+4AE0,共支援六萬多個字符);在零號平面以外的字元則需要使用五位或六位十六進制數了。舊版的Unicode標準使用相近的標記方法,但卻有些微小差異:在Unicode 3.0裏使用「U-」然後緊接着八位數,而「U+」則必須隨後緊接着四位數。

標準[編輯]

位於美國加州的Unicode組織允許任何願意支付會費的公司和個人加入,其成員包含了主要的電腦軟硬件廠商,例如奧多比系統蘋果公司惠普IBM微軟施樂等。

20世紀80年代末,組成Unicode組織的商業機構,和國際合作的國際標準化組織因為電腦普及和資訊國際化的前提下,分別各自成立了Unicode組織[2]和ISO-10646工作小組。他們不久便發現對方的存在,大家為著相同的目的而工作,於是兩個組織便共同合作開發適用於各國語言的通用碼,而且「相當有默契地」各自發表Unicode和ISO-10646字集。雖然實際上兩者的字集編碼相同,但實質上兩者確實為兩個不同的標準。

統一碼聯盟在1991年首次發佈了The Unicode Standard。Unicode的開發結合了國際標準化組織所制定的ISO/IEC 10646,即通用字元集。Unicode與ISO/IEC 10646在編碼的運作原理相同,但The Unicode Standard包含了更詳盡的實現資訊、涵蓋了更細節的主題,諸如位元編碼(bitwise encoding)、校對以及呈現等。The Unicode Standard也列舉了諸多的字元特性,包含了那些必須支援兩種閱讀方向的文字(由左至右或由右至左的文字閱讀方向,例如阿拉伯文是由右至左)。Unicode與ISO/IEC 10646這兩個標準在術語上的使用有些微的不同。

在2005年,Unicode的第十萬個字元被引入成為標準之一,該字元被用於馬拉雅拉姆語

歷史[編輯]

Unicode截至目前為止歷次的版次與發佈時間如下:

Unicode的編碼和實現[編輯]

大概來說,Unicode編碼系統可分為編碼方式和實現方式兩個層次。

編碼方式[編輯]

統一碼的編碼方式與ISO 10646通用字符集概念相對應。目前實際應用的統一碼版本對應於UCS-2,使用16的編碼空間。也就是每個字符佔用2個位元組。這樣理論上一共最多可以表示216(即65536)個字符。基本滿足各種語言的使用。實際上目前版本的統一碼並未完全使用這16位元編碼,而是保留了大量空間以作為特殊使用或將來擴充功能。

上述16位元統一碼字符構成基本多文種平面。最新(但未實際廣泛使用)的統一碼版本定義了16個輔助平面,兩者合起來至少需要佔據21位的編碼空間,比3位元組略少。但事實上輔助平面字符仍然佔用4位元組編碼空間,與UCS-4保持一致。未來版本會擴充到ISO 10646-1實現級別3,即涵蓋UCS-4的所有字符。UCS-4是一個更大的尚未填充完全的31位元字符集,加上恆為0的首位,共需佔據32位元,即4位元組。理論上最多能表示231個字符,完全可以涵蓋一切語言所用的符號。

基本多文種平面的字符的編碼為U+hhhh,其中每個h代表一個十六進制數碼,與UCS-2編碼完全相同。而其對應的4位元組UCS-4編碼後兩個位元組一致,前兩個位元組則所有位均為0。

關於統一碼和ISO 10646及UCS的詳細關聯,見通用字符集

實現方式[編輯]

Unicode的實現方式不同於編碼方式。一個字符的Unicode編碼是確定的。但是在實際傳輸過程中,由於不同系統平台的設計不一定一致,以及出於節省空間的目的,對Unicode編碼的實現方式有所不同。Unicode的實現方式稱為Unicode轉換格式(Unicode Transformation Format,簡稱為UTF)

例如,如果一個僅包含基本7位ASCII字符的Unicode檔案,如果每個字符都使用2位元組的原Unicode編碼傳輸,其第一位元組的8位元始終為0。這就造成了比較大的浪費。對於這種情況,可以使用UTF-8編碼,這是一種變長編碼,它將基本7位ASCII字符仍用7位編碼表示,佔用一個位元組(首位補0)。而遇到與其他Unicode字符混合的情況,將按一定演算法轉換,每個字符使用1-3個位元組編碼,並利用首位為0或1進行識別。這樣對以7位ASCII字符為主的西文文件就大大節省了編碼長度(具體方案參見UTF-8)。類似的,對未來會出現的需要4個位元組的輔助平面字符和其他UCS-4擴充字符,2位元組編碼的UTF-16也需要透過一定的演算法進行轉換。

再如,如果直接使用與Unicode編碼一致(僅限於BMP字符)的UTF-16編碼,由於每個字符佔用了兩個位元組,在麥金塔電腦Mac)機和個人電腦上,對位元組順序的理解是不一致的。這時同一位元組流可能會被解釋為不同內容,如某字符為十六進制編碼4E59,按兩個位元組拆分為4E和59,在Mac上讀取時是從低位元組開始,那麼在Mac OS會認為此4E59編碼為594E,找到的字符為「奎」,而在Windows上從高位元組開始讀取,則編碼為U+4E59的字符為「乙」。就是說在Windows下以UTF-16編碼保存一個字符「乙」,在Mac OS環境下開啟會顯示成「奎」。此類情況說明UTF-16的編碼順序若不加以人為定義就可能發生混淆,於是在UTF-16編碼實現方式中使用了大端序(Big-Endian,簡寫為UTF-16 BE)、小端序(Little-Endian,簡寫為UTF-16 LE)的概念,以及可附加的位元組順序記號解決方案,目前在PC機上的Windows系統和Linux系統對於UTF-16編碼預設使用UTF-16 LE。(具體方案參見UTF-16

此外Unicode的實現方式還包括UTF-7PunycodeCESU-8SCSUUTF-32GB18030等,這些實現方式有些僅在一定的國家和地區使用,有些則屬於未來的規劃方式。目前通用的實現方式是UTF-16小端序(LE)、UTF-16大端序(BE)和UTF-8。在微軟公司Windows XP附帶的記事本(Notepad)中,「另存為」對話方塊可以選擇的四種編碼方式除去非Unicode編碼的ANSI(對於英文系統即ASCII編碼,中文系統則為GB2312Big5編碼)外,其餘三種為「Unicode」(對應UTF-16 LE)、「Unicode big endian」(對應UTF-16 BE)和「UTF-8」。

目前輔助平面的工作主要集中在第二和第三平面的中日韓統一表意文字中,因此包括GBKGB18030Big5簡體中文繁體中文日文韓文以及越南喃字的各種編碼與Unicode的協調性被重點關注。考慮到Unicode最終要涵蓋所有的字符。從某種意義而言,這些編碼方式也可視作Unicode的出現於其之前的既成事實的實現方式,如同ASCII及其擴充功能Latin-1一樣,後兩者的字符在16位元Unicode編碼空間中的編碼第一位元組各位全為0,第二位元組編碼與原編碼完全一致。但上述東亞語言編碼與Unicode編碼的對應關聯要複雜得多。

Unicode字符平面對映[編輯]

非Unicode環境[編輯]

在非Unicode環境下,由於不同國家和地區採用的字符集不一致,很可能出現無法正常顯示所有字符的情況。微軟公司使用了內碼表(Codepage)轉換表的技術來過渡性的部分解決這一問題,即透過指定的轉換表將非Unicode的字符編碼轉換為同一字符對應的系統內部使用的Unicode編碼。可以在「語言與區域設定」中選擇一個內碼表作為非Unicode編碼所採用的預設編碼方式,如936為簡體中文GB碼,950為繁體中文Big5(皆指PC上使用的)。在這種情況下,一些非英語的歐洲語言編寫的軟件和文件很可能出現亂碼。而將內碼表設定為相應語言中文處理又會出現問題,這一情況無法避免。只有完全採用統一編碼才能徹底解決這些問題,但目前尚無法做到這一點。

內碼表技術現在廣泛為各種平台所採用。UTF-7的內碼表是65000,UTF-8的內碼表是65001。

XML和Unicode[編輯]

XML及其子集XHTML採用UTF-8作為標準字集,理論上我們可以在各種支援XML標準的瀏覽器上顯示任何地區文字的網頁,只要電腦本身安裝有合適的字型即可。可以利用&#nnn;的格式顯示特定的字符。nnn代表該字符的十進制Unicode代碼。如果採用十六進制代碼,在編碼之前加上x字符即可。但部分舊版本的瀏覽器可能無法識別十六進制代碼。

過去電腦編碼的8位元標準,使每個國家都只按國家使用的字符而編定各自的編碼系統;而對於部份字符系統比較複雜的語言,如越南語,又或者東亞國家的大型字符集,都不能在8位元的環境下正常顯示。

只是最近才有在文字中對十六進制的支援,那麼舊版本的瀏覽器顯示那些字符或許可能有問題-大概首先會遇到的一個問題只是在對於大於8位Unicode字符的顯示。解決這個問題的普遍做法仍然是將其中的十六進制碼轉換成一個十進制碼(例如:♠代替♠)。

也有一些字符集標準將一些常用的標誌存放在字符內碼外面,那麼你可能使用象這樣的文字標誌來表示一個長劃(—)的情況,即使它的字符內碼已經被使用,這些標準也不包含那個字符。

然而部分由於Unicode版本發展原因,很多瀏覽器只能顯示UCS-2完整字符集,也即現在使用的Unicode版本中的一個小子集。下表可以檢驗您的瀏覽器如何顯示各種Unicode代碼:

代碼 字符標準名稱(英語) 在瀏覽器上的顯示
A 大寫拉丁字母「A」 A
ß 小寫拉丁字母「Sharp S」 ß
þ 小寫拉丁字母「Thorn」 þ
Δ 大寫希臘字母「Delta」 Δ
Й 大寫斯拉夫字母「Short I」 Й
ק 希伯來字母「Qof」 ק
م 阿拉伯字母「Meem」 م
๗ 泰文數碼7
ቐ 埃塞俄比亞音節文字「Qha」
あ 日語平假名「A」
ア 日語片假名「A」
叶 簡體漢字「叶」
葉 繁體漢字「葉」
엽 韓國音節文字「Yeop」

一些多語言支援的網頁瀏覽器,比如微軟Windows系統的Internet Explorer 5.5及以上版本,以及跨平台的瀏覽器MozillaNetscape 6,可以在安裝時根據需要動態地使用相應的字符集,預先安裝了合適的語言套件,就可以同時顯示頁面上的各種Unicode字符。Internet Explorer 5.5還提出用戶可以在需要新字型時,即裝即用。另外的瀏覽器如Netscape Navigator 4.77,則只能顯示跟頁面編碼相應字符集中的文字。當你使用後一種瀏覽器時,你不大可能預先安裝所有的字型,即使有了字型,瀏覽器也不一定能將這些字型完全應用起來。可能遇到的情況是,這種瀏覽器只能夠顯示部分文字,因為它們是按照標準進行編碼,儘管理論上在相容的系統中,只要有了相應的Code2000字型,就可以正確顯示。一種變通的辦法,是將某些少見的字符,透過「名稱實體參照」的方式來使用。

輸入方法[編輯]

中文輸入法[編輯]

截至2011年10月,可以使用微軟拼音2003或2007版本,倉頡輸入法第三代第五代第六代版本,鄭碼Unicode版本,海峰五筆9.3版本,新注音輸入法VimIM進行輸入。

  • 微軟拼音輸入法啟動狀態下,單擊語言欄上的「功能選單」按鈕,指向「輔助輸入法」即可發現「Unicode碼輸入方式」,利用它可以直接輸入Unicode相應十六進制值的方式輸入相應文字。例如中文「胥」輸入「5066」,朝鮮文字「셅」輸入「c145」(不需要在前面加0x或x)。
  • 倉頡輸入法已爲Unicode漢字、類漢字編碼,可以在倉頡輸入法方式下通過倉頡碼輸入方式輸入Unicode內的中日韓漢字及韓文。以倉頡輸入法第五代爲例,例如漢字「㗎」輸入「口大口木」,漢字「胥」輸入「弓人月」,漢字「㿱」輸入「手中木竹水」,朝鮮文字「닮」輸入「尸卜尸女口」。
  • 鄭碼已爲Unicode漢字、類漢字編碼,可以在鄭碼輸入法方式下通過鄭碼字碼輸入方式輸入Unicode內的中日韓漢字及韓文。例如漢字「㗎」輸入「JYJF」,漢字「胥」輸入「XIQ」,漢字「㿱」輸入「DPXI」,朝鮮文字「길」輸入「XIYY」。
  • 海峰五筆此輸入法已經直接支援透過五筆碼輸入方式輸入Unicode內的任意中日韓漢字,但無法使用鍵入Unicode碼的方式輸入。例如漢字(Unicode部分)「㗎」為「keks」,CJK擴展B區的「𣿱」為「iyho」和CJK擴展C區的「𫆦」為「muih」。
  • 注音輸入法在輸入法啟動狀態時,打入鍵盤上的「多功能前導字元鍵」(及通用鍵盤上之「`」),第一次使用會彈出說明。輸入Unicode字元「胥」則是在鍵盤上鍵入「`U5066」。而韓語中的「셅」,則輸入「`UC145」。而要輸入日語自製漢字「峠」,則是「`U5CE0」。
  • VimIM在Vim環境中,可以直接鍵入十進制或十六進制Unicode碼。既不需要啟動輸入法,也不需要碼表。
  • 嘸蝦米輸入法,支援Unicode,以26個英文字母為組字按鍵,支援基本繁體中文、簡體中文外,還可直接輸入符號、日文漢字平假名片假名

日文輸入法[編輯]

使用Microsoft IME 2007,可以在IME PAD裡找到Unicode的點選表。點選字符即可輸入。選擇字型可以預覽字符效果。

其他[編輯]

除了輸入法外,操作系統也會提供另外幾種方法輸入Unicode。像是Windows 2000之後的Windows系統就提供一個可點擊的字符對映表。又或者在Microsoft Word下,按下Alt鍵不放,輸入0和某個字符的Unicode編碼(十進制),再鬆開Alt鍵即可得到該字符,如Alt + 033865會得到Unicode字元。另外按Alt + X組合鍵,MS Word也會將光標前面的字符同其十六進制的四位Unicode編碼進行互相轉換。

漢字問題[編輯]

統一碼這種為數萬漢字逐一編碼的方式很浪費資源,且要把漢字增加到標準中也並不容易,因此去研究以漢字部件產生漢字的方法(如動態組字),期望取代為漢字逐一編碼的方法。Unicode委員會在關於中文和日語的常用問題清單[3]裏回答了此問題。主要問題是漢字中各個元件的相對大小不是固定的。比如「員」字,由「口」和「貝」組成,而「唄」也是由「口」和「貝」組成,但其相對位置和大小並不一致。還有一些其他原因,比如字符比較和排序時需要先對編碼流進行分析後才能得到各個字符,增加處理程式複雜性等。

另一個問題是:由於中國歷代字書有收錄訛字(即錯別字)的習慣,因此Unicode編碼中收入大量訛字,佔據大量空間,引發批評[來源請求]。電腦檔案中若使用錯訛字,在用正確字做檢索時,用錯訛字寫出的同一個詞語無法檢出。

參考文獻[編輯]

外部連結[編輯]

Wikibooks-logo.svg
您可以在維基教科書中尋找此百科條目的相關電子教程:

參見[編輯]