Unicode(統一碼、萬國碼、單一碼)是一種在計算機上使用的字符編碼。它爲每種語言中的每一個字符設定了統一而且惟一的二進制編碼,以知足跨語言、跨平臺進行文本轉換、處理的要求。1990年開始研發,1994年正式公佈。隨着計算機工做能力的加強,Unicode也在面世以來的十多年裏獲得普及。算法
Unicode****的編碼和實現數據庫
大概來講,Unicode編碼系統可分爲編碼方式和實現方式兩個層次。瀏覽器
1.編碼方式字體
Unicode的編碼方式與ISO10646的通用字元集(亦稱[通用字符集])(Universal Character Set,UCS)概念相對應,目前的用於實用的Unicode版本對應於UCS-2,使用16位的編碼空間,也就是每一個字符佔用2個字節。編碼
統一字符編碼標準是一種十六位的字符編碼標準,而ASCII則是七位編碼,只適用於英文。另有西歐國家所用的ISO Latin-1八位編碼。使用Unicode的好處就是用一個字符集就可解決全部現今世界上的可書寫語言。Unicode共有2^16即65536個編碼,其中有近39000種已被定義完成,而中國字就佔了21000種 !操作系統
上述16位Unicode字符構成基本多文種平面(Basic Multilingual Plane,簡稱(BMP)。最新(但未實際普遍使用)的Unicode版本定義了16個輔助平面,二者合起來至少須要佔據21位的編碼空間,比3字節略少。但事實上輔助平面字符仍然佔用4字節編碼空間,與UCS-4保持一致。將來版本會擴充到ISO10646-1實現級別3,即涵蓋UCS-4的全部字符。UCS-4是一個更大的還沒有填充徹底的31位字符集,加上恆爲0的首位,共需佔據32位,即4字節。理論上最多能表示2^31個字符,徹底能夠涵蓋一切語言所用的符號。設計
BMP字符的Unicode編碼表示爲U+hhhh,其中每一個h表明一個十六進制數位。與UCS-2編碼徹底相同。對應的4字節UCS-4編碼後兩個字節一致,前兩個字節的全部位均爲0。code
2.實現方式orm
Unicode的實現方式不一樣於編碼方式。一個字符的Unicode編碼是肯定的。可是在實際傳輸過程當中,因爲不一樣系統平臺的設計不必定一致,以及出於節省空間的目的,對Unicode編碼的實現方式有所不一樣。Unicode的實現方式稱爲Unicode轉換格式(Unicode Translation Format,簡稱爲UTF)。ci
再如,若是直接使用與 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)的概念,以及可附加的BOM(Byte Order Mark)解決方案,目前在PC機上的Windows系統和Linux系統對於UTF-16編碼默認使用UTF-16 LE。(具體方案參見UTF-16)
此外Unicode的實現方式還包括UTF-七、Puny code、CESU-八、SCSU、UTF-32等,這些實現方式有些僅在必定的國家和地區使用,有些則屬於將來的規劃方式。目前通用的實現方式是UTF-16小尾序(BOM)、UTF-16大尾序(BOM)和UTF-8。在微軟公司Windows XP操做系統附帶的記事本中,「另存爲」對話框能夠選擇的四種編碼方式除去非Unicode編碼的ANSI外,其他三種「Unicode」、「Unicode Big Endian」和「UTF-8」即分別對應這三種實現方式。
目前輔助平面的工做主要集中在第二和第三平面的中日韓統一表意文字中,所以包括GBK、GB18030、Big5等簡體中文、正體中文、日文、韓語以及越南字符的各類編碼與Unicode的協調性被重點關注。考慮到Unicode最終要涵蓋全部的字符,從某種意義而言,這些編碼方式也可視做Unicode的出現於其以前的既成事實的實現方式,如同ASCII及其擴展Latin-1同樣,後二者的字符在16位Unicode編碼空間中的編碼第一字節各位全爲0,第二字節編碼與原編碼徹底一致。但上述東亞語言編碼與Unicode編碼的對應關係要複雜得多。
非Unicode環境
在非Unicode環境下,因爲不一樣國家和地區採用的字符集不一致,極可能出現沒法正常顯示全部字符的狀況。微軟公司使用了代碼頁(Code page)轉換表的技術來過渡性地部分解決這一問題,即經過指定的轉換表將非Unicode的字符編碼轉換爲同一字符對應的系統內部使用的Unicode編碼。能夠在「語言與區域設置」中選擇一個代碼頁做爲非Unicode編碼所採用的默認編碼方式,如936爲簡體中文GBK,950爲正體中文Big5(皆指PC上使用的)。在這種狀況下,一些非英語的歐洲語言編寫的軟件和文檔極可能出現亂碼。而將代碼頁設置爲相應語言中文處理又會出現問題,這一狀況沒法避免。從根本上說,徹底採用統一編碼纔是解決之道,但目前上沒法作到這一點。
代碼頁技術如今普遍爲各類平臺所採用。UTF-7的代碼頁是65000,UTF-8的代碼頁是65001。
XML****和Unicode
XML及其子集HTML採用UTF-8做爲標準字集,理論上咱們能夠在各類支持XML標準的瀏覽器上顯示任何地區文字的網頁,只要電腦自己安裝有合適的字體便可。能夠利用&#nnn;的格式顯示特定的字符。nnn表明該字符的十進制Unicode代碼。若是採用十六進制代碼,在編碼以前加上x字符便可。但部分舊版本的瀏覽器可能沒法識別十六進制代碼。
然而部分因爲Unicode版本發展緣由,不少瀏覽器只能顯示UCS-2完整字符集也即如今使用的Unicode版本中的一個小子集。
輸入Unicode
除了輸入法外,操做系統會提供幾種方法輸入Unicode。像是Windows2000以後的Windows系統就提供一個可點擊的表。例如在Microsoft Word之下,按下Alt鍵不放,輸入0和某個字符的Unicode編碼(十進制),再鬆開Alt鍵便可獲得該字符,如Alt+033865會獲得Unicode字符葉。另外按Alt+X組合鍵,MSWord也會將光標前面的字符同其十六進制的四位Unicode編碼進行互相轉換。
Unicode目前已經有5.0版本。世界上有一大批計算機、語言學等科學家專門研究Unicode,到了如今Unicode標準已經不單是一個編碼標準,仍是記錄人類語言文字資料的一個巨大的數據庫,同時從事人類文化遺產的發掘和保護工做。
對於中文而言,Unicode16編碼裏面已經包含了GB18030裏面的全部漢字(27484個字),目前Unicode標準準備把康熙字典的全部漢字放入到Unicode32bit編碼中。
UTF-8
UTF-8(8 位元 Universal Character Set/Unicode Transformation Format)是一種針對Unicode的可變長度字符編碼。它能夠用來表示Unicode標準中的任何字符,且其編碼中的第一個字節仍與ASCII相容,這使得原來處理ASCII字符的軟件無需或只需作少部份修改,便可繼續使用。所以,它逐漸成爲電子郵件、網頁及其餘儲存或傳送文字的應用中,優先採用的編碼。
UTF-8使用一至四個字節爲每一個字符編碼:
128個US-ASCII字符只需一個字節編碼(Unicode範圍由U+0000至U+007F)。
帶有附加符號的拉丁文、希臘文、西裏爾字母、亞美尼亞語、希伯來文、阿拉伯文、敘利亞文及它拿字母則須要二個字節編碼(Unicode範圍由U+0080至U+07FF)。
其餘基本多文種平面(BMP)中的字符(這包含了大部分經常使用字)使用三個字節編碼。
其餘極少使用的Unicode輔助平面的字符使用四字節編碼。
對上述說起的第四種字符而言,UTF-8使用四個字節來編碼彷佛太耗費資源了。但UTF-8對全部經常使用的字符均可以用三個字節表示,並且它的另外一種選擇,UTF-16編碼,對前述的第四種字符一樣須要四個字節來編碼,因此要決定UTF-8或UTF-16哪一種編碼比較有效率,還要視所使用的字符的分佈範圍而定。不過,若是使用一些傳統的壓縮系統,好比DEFLATE,則這些不一樣編碼系統間的差別就變得微不足道了。由於傳統壓縮算法在壓縮較短文字時的效果不大,能夠考慮使用Standard Compression Scheme For Unicode(SCSU)。
Unicode字符的位元被分割爲幾部分,並分配到UTF-8的字節串中較低的位元的位置。在U+0080的如下字符都使用內含其字符的單字節編碼。這些編碼正好對應7位元的ASCII字符。在其餘狀況,有可能須要多達4個字符組來表示一個字符。這些多字節的最高有效位元會設定成1,以防止與7位元的ASCII字符混淆,並保持標準的字節主導字串(standard byte-oriented string)運做順利。