跳转到内容

Unicode

本页使用了标题或全文手工转换
维基百科,自由的百科全书

这是本页的一个历史版本,由F(x)Box留言 | 贡献2011年12月2日 (五) 14:07 漢字問題编辑。这可能和当前版本存在着巨大的差异。

Unicode標誌
Unicode標誌

Unicode統一碼萬國碼單一碼標準萬國碼)是電腦科學領域裡的一項業界標準,用以統一地呈現和處理世界上大部分的文字系統,並為其編碼。

Unicode依照通用字符集(Universal Character Set)的標準來發展,同時也以書本的形式[1]對外發表。Unicode至今仍在不斷擴增,每個新版本都加入更多新的字符。目前最新的Unicode第六版,除了已納入超過十萬個字符(Unicode的第十萬個字符在2005年獲採納,且認可成為標準之一),還包含可用作視覺參考的代碼圖表、編碼方法、標準的字符編碼,以及記錄了如大小寫字母等字符特性的列表這些資料。

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

Unicode備受认可,並廣泛地應用於電腦軟體的國際化與本地化過程。有很多新科技,如可扩展置标语言Java程式語言,以及現代的作業系統,都採用Unicode編碼。

起源與發展

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

Unicode 编码包含了不同写法的字,如“aa”、“強/强”、“戶/户/戸”。然而在汉字方面引起了一字多形的認定爭議(詳見中日韓統一表意文字主題)。

在文字處理方面,Unicode 的功用是為每一個字元提供一個唯一的代碼(即一組數字),而不是一種字形。換句話說,Unicode是將字元以一種抽象的方式來呈現,而將視覺上的演繹工作(例如字體大小、外觀形狀、字體形態、文體等)留給其他軟件來處理,例如網頁瀏覽器或是文字處理器。

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

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

標準

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

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

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

在西元2005年,Unicode的第十萬個字元被輸入成為標準之一,其為馬來亞拉姆語(Malayalam,印度西南部沿海居民的語言)的Praslesham(പ്രശ്ലേഷം)。

历史

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

  • Unicode 1.0:1991年10月
  • Unicode 1.0.1:1992年6月
  • Unicode 1.1:1993年6月
  • Unicode 2.0:1997年7月
  • Unicode 2.1:1998年5月
  • Unicode 2.1.2:1998年5月
  • Unicode 3.0:1999年9月;涵蓋了來自ISO 10646-1的十六位元通用字元集(UCS)基本多文種平面(Basic Multilingual Plane)
  • Unicode 3.1:2001年3月;新增從ISO 10646-2定義的輔助平面(Supplementary Planes)
  • Unicode 3.2:2002年3月
  • Unicode 4.0:2003年4月
  • Unicode 4.0.1:2004年3月
  • Unicode 4.1:2005年3月
  • Unicode 5.0:2006年7月
  • Unicode 5.1:2008年4月
  • Unicode 5.2:2009年10月
  • Unicode 6.0:2010年10月

Unicode的编码和实现

大概来说,Unicode编码系统可分为编码方式和实现方式两个层次。

编码方式

Unicode的编码方式与ISO 10646通用字符集(Universal Character Set,UCS)概念相对应,目前实际应用的Unicode版本对应于UCS-2,使用16的编码空间。也就是每个字符占用2个字节。这样理论上一共最多可以表示216即65536个字符。基本满足各种语言的使用。实际上目前版本的Unicode尚未填充满这16位编码,保留了大量空间作为特殊使用或将来扩展。

上述16位Unicode字符构成基本多文种平面(Basic Multilingual Plane,简称BMP)。最新(但未实际廣泛使用)的Unicode版本定义了16个辅助平面,两者合起来至少需要占据21位的编码空间,比3字节略少。但事实上辅助平面字符仍然占用4字节编码空间,与UCS-4保持一致。未来版本会扩充到ISO 10646-1实现级别3,即涵盖UCS-4的所有字符。UCS-4是一个更大的尚未填充完全的31位字符集,加上恒为0的首位,共需占据32位,即4字节。理论上最多能表示231个字符,完全可以涵盖一切语言所用的符号。

BMP字符的Unicode编码表示为U+hhhh,其中每个h 代表一个十六进制数位。与UCS-2编码完全相同。对应的4字节UCS-4编码后两个字节一致,前两个字节的所有位均为0。

关于Unicode和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编码,由于每个字符占用了两个字节,在Macintosh (Mac)机和PC机上,对字节顺序的理解是不一致的。这时同一字节流可能会被解释为不同内容,如某字符为十六进制编码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-32等,这些实现方式有些仅在一定的国家和地区使用,有些则属于未来的规划方式。目前通用的实现方式是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为简体中文GBK,950为正体中文Big5(皆指PC上使用的)。在这种情况下,一些非英语的欧洲语言编写的软件和文档很可能出现乱码。而将代码页设置为相应语言中文处理又会出现问题,这一情况无法避免。从根本上说,完全采用统一编码才是解决之道,但目前尚无法做到这一点。

代码页技术现在广泛为各种平台所采用。UTF-7的代码页是65000,UTF-8的代码页是65001。

XML和Unicode

XML及其子集XHTML采用UTF-8作为标准字集,理论上我们可以在各种支持XML标准的浏览器上显示任何地区文字的网页,只要电脑本身安装有合适的字体即可。可以利用&#nnn;的格式显示特定的字符。nnn代表该字符的十进制Unicode代码。如果采用十六进制代码,在编码之前加上x字符即可。但部分旧版本的浏览器可能无法识别十六进制代码。

过去电脑编码的8位标准,使每个国家都只按国家使用的字符而编定各自的编码系统;而对於部份字符系统比较复杂的语言,如越南语,又或者东亚国家的大型字符集,都不能在8位的环境下好好显示。若连自己的语言也未必可以好好显示,遑论显示其他国家的文字。然而,现在于HTML和XML,我们可以利用&#nnn;的格式显示特定的字符。nnn代表该字符的十进位Unicode代码。如果想采用十六进位代码的话,要在编码之前加上x字符。

只是最近才有在文本中对十六进制的支持,那么旧版本的浏览器显示那些字符或许可能有问题-大概首先会遇到的一个问题只是在对于大于8位Unicode字符的显示。解决这个问题的普遍做法仍然是将其中的十六进制码转换成一个十进制码(例如:用♠代替♠)。

也有一些字符集标准将一些常用的标志存放在字符内码外面,那么你可能使用象—这样的文本标志来表示一个长划(—)的情况,即使它的字符内码已经被使用,这些标准也不包含那个字符。

然而部分由于Unicode版本发展原因,很多浏览器只能显示UCS-2完整字符集,也即现在使用的Unicode版本中的一个小子集。下表可以检验您的浏览器怎样显示各种各样的Unicode代码:

代码 字符标准名称(英语) 在浏览器上的显示
A 大写拉丁字母"A" A
ß 小写拉丁字母"Sharp S" ß
þ 小写拉丁字母"Thorn" þ
Δ 大写希腊字母"Delta" Δ
Й 大写斯拉夫字母"Short I" Й
ק 希伯来字母"Qof" ק
م 阿拉伯字母"Meem" م
๗ 泰文数字7
ቐ 埃塞俄比亚音节文字"Qha"
あ 日语平假名"A"
ア 日语片假名"A"
叶 简体汉字"叶"
葉 正体汉字"葉"
엽 韩国音节文字"Yeob"

一些多语言支持的网页浏览器,比如微软Windows系统的Internet Explorer 5.5,以及跨平台的浏览器MozillaNetscape 6,可以在安裝時根据需要动态地使用相应的字符集,预先安装了合适的语言包,就可以同时显示页面上的各种Unicode字符。IE 5.5还提出用户可以在需要新字体时,即装即用。另外的浏览器如Netscape Navigator 4.77,则只能显示跟页面编码相应字符集中的文字。当你使用后一种浏览器时,你不大可能预先安装所有的字体,即使有了字体,浏览器也不一定能将这些字体完全应用起来。可能遇到的情况是,这种浏览器只能够显示部分文字,因为它们是按照标准进行编码,尽管理论上在兼容的系统中,只要有了相应的字体,就可以正确显示。一种变通的办法,是将某些少见的字符,通过“名称实体引用”的方式来使用。

输入方法

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

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

使用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的漢字處理方法一直備受抨擊。有人指出這種把數萬漢字逐一編碼的方式,非常浪費資源,要把漢字加到Unicode標準中也不容易。也有批評處理Unicode中漢字編碼的專家,並不是真正研究漢字的學者。從早期的中文電腦時期開始,已有研究以部件產生漢字(動態組字),取代漢字逐一編碼方法。

Unicode编码表

相關條目

外部链接

注釋

  1. ^ The Unicode Standard 第五版. Addison-Wesley Professional. ISBN 0321480910. 
  2. ^ [1]

Template:Link FA