Unicode、UTF-8、UTF-16?編碼格式花傻傻⋯⋯

Unicode
Unicode(中文:萬國碼、國際碼、統一碼、單一碼)是電腦科學領域裡的一項業界標準。
它對世界上大部分的文字系統進行了整理、編碼,使得電腦可以用更為簡單的方式來呈現和處理文字。
Unicode伴隨著通用字符集的標準而發展,同時也以書本的形式對外發表。Unicode至今仍在不斷增修,每個新版本都加入更多新的字元。目前最新的版本為第六版,已收入了超過十萬個字元(第十萬個字元在2005年獲採納)。Unicode涵蓋的資料除了視覺上的字形、編碼方法、標準的字元編碼外,還包含了字元特性,如大小寫字母。
Unicode發展由非營利機構統一碼聯盟負責,該機構致力於讓Unicode方案取代既有的字元編碼方案。因為既有的方案往往空間非常有限,亦不適用於多語環境。
Unicode備受認可,並廣泛地應用於電腦軟體的國際化與在地化過程。有很多新科技,如可延伸標示語言、Java程式語言以及現代的作業系統,都採用Unicode編碼。

比較常出現的問題就是Winsows記事本裡面寫的儲存格式「Unicode」其實就是「UTF-16」,不過Windows的工程師將它命名為「Unicode」,早期Windows並不支援「Unicode」,現在加入了又不想被人家發現,只好故弄玄虛的讓大家搞不懂它⋯⋯

Unicode有多種編碼方式,具體如下:


UTF-8
UTF-8(8-bit Unicode Transformation Format)是一種針對Unicode的可變長度字元編碼,也是一種字首碼。它可以用來表示Unicode標準中的任何字元,且其編碼中的第一個位元組仍與ASCII相容,這使得原來處理ASCII字元的軟體無須或只須做少部份修改,即可繼續使用。因此,它逐漸成為電子郵件、網頁及其他儲存或傳送文字的應用中,優先採用的編碼。
UTF-8使用一至六個位元組為每個字元編碼(儘管如此,2003年11月UTF-8被RFC 3629重新規範,只能使用原來Unicode定義的區域,U+0000到U+10FFFF,也就是說最多4位元位元組):

  1. 128個US-ASCII字元只需一個位元組編碼(Unicode範圍由U+0000至U+007F)。
  2. 帶有附加符號的拉丁文、希臘文、西里爾字母、亞美尼亞語、希伯來文、阿拉伯文、敘利亞文及它拿字母則需要兩個位元組編碼(Unicode範圍由U+0080至U+07FF)。
  3. 其他基本多文種平面(BMP)中的字元(這包含了大部分常用字)使用三個位元組編碼(Unicode範圍由U+0800至U+FFFF)。
  4. 其他極少使用的Unicode 輔助平面的字元使用四至六位元組編碼(Unicode範圍由U+10000至U+1FFFFF使用四位元組,Unicode範圍由U+200000至U+3FFFFFF使用五位元組,Unicode範圍由U+4000000至U+7FFFFFFF使用六位元組)。

UTF-16
UTF-16是Unicode字元編碼五層次模型的第三層:字元編碼表(Character Encoding Form,也稱為"storage format")的一種實作方式。即把Unicode字符集的抽象碼位對映為16位元長的整數(即碼元)的序列,用於資料儲存或傳遞。Unicode字元的碼位,需要1個或者2個16位元長的碼元來表示,因此這是一個變長表示。
UTF是"Unicode/UCS Transformation Format"的首字母縮寫,即把Unicode字元轉換為某種格式之意。UTF-16正式定義於ISO/IEC 10646-1的附錄C,而RFC2781也定義了相似的做法。
Unicode的編碼空間從U+0000到U+10FFFF,共有1,112,064個碼位(code point)可用來對映字元. Unicode的編碼空間可以劃分為17個平面(plane),每個平面包含216(65,536)個碼位。17個平面的碼位可表示為從U+xx0000到U+xxFFFF,其中xx表示十六進制值從0016到1016,共計17個平面。第一個平面稱為基本多語言平面(Basic Multilingual Plane, BMP),或稱第零平面(Plane 0)。其他平面稱為輔助平面(Supplementary Planes)。基本多語言平面內,從U+D800到U+DFFF之間的碼位區段是永久保留不對映到Unicode字元。UTF-16就利用保留下來的0xD800-0xDFFF區段的碼位來對輔助平面的字元的碼位進行編碼。


從U+0000至U+D7FF以及從U+E000至U+FFFF的碼位

第一個Unicode平面(碼位從U+0000至U+FFFF)包含了最常用的字元。該平面被稱為基本多語言平面,縮寫為BMP(Basic Multilingual Plane, BMP)。UTF-16與UCS-2編碼這個範圍內的碼位為16位元長的單個碼元,數值等價於對應的碼位. BMP中的這些碼位是僅有的可以在UCS-2中表示的碼位.


從U+10000到U+10FFFF的碼位

輔助平面(Supplementary Planes)中的碼位,在UTF-16中被編碼為一對16位元長的碼元(即32bit,4Bytes),稱作代理對(surrogate pair),具體方法是:
  1. 碼位減去0x10000,得到的值的範圍為20位元長的0..0xFFFFF.
  2. 高位的10位元的值(值的範圍為0..0x3FF)被加上0xD800得到第一個碼元或稱作高位代理(high surrogate),值的範圍是0xD800..0xDBFF.由於高位代理比低位代理的值要小,所以為了避免混淆使用,Unicode標準現在稱高位代理為前導代理(lead surrogates).
  3. 低位的10位元的值(值的範圍也是0..0x3FF)被加上0xDC00得到第二個碼元或稱作低位代理(low surrogate),現在值的範圍是0xDC00..0xDFFF.由於低位代理比高位代理的值要大,所以為了避免混淆使用,Unicode標準現在稱低位代理為後尾代理(trail surrogates).
UTF-32
UTF-32 (或 UCS-4)是一種將Unicode字元編碼的協定,對每一個Unicode碼位使用恰好32位元。其它的Unicode transformation formats則使用不定長度編碼。
因為UTF-32對每個字元都使用4位元組,就空間而言,是非常沒有效率的。特別地,非基本多文種平面的字元在大部分檔案中通常很罕見,以致於它們通常被認為不存在佔用空間大小的討論,使得UTF-32通常會是其它編碼的二到四倍。
雖然每一個碼位使用固定長度的位元組看似方便,它並不如其它Unicode編碼使用得廣泛。與UTF-8及UTF-16相比,它有點更容易遭截斷。即使使用了"定寬"字型,除非在一些非常有限的情況下,否則它並不會使得計算顯示一個字串的寬度更加容易。主要原因是,存在著一個字元位置會有多於一種可能的碼點(結合字元)或一個碼點用多於一個字元位置(如CJK表意字元)。結合符號也意味著,文書編輯者不能將一個碼點視同一個編輯上的單位。
原本ISO 10646標準定義了一個32位元的編碼形式,稱作UCS-4,使用通用字符集(UCS)的每一個字元,會在0到十六進制的7FFFFFFF這樣的字碼空間中,被表示成一個的32位元的碼值。
UCS-4足以用來表示所有的Unicode的字碼空間,其最大的碼位為十六進制的7FFFFFFF,所以其空間約20億個碼位。有些人認為保留如此大的字碼空間卻只為了對應這很小的碼集是浪費的所以一個新的編碼UTF-32被提出來了。UTF-32 是一個 UCS-4 的子集,使用32-位元的碼值,只在0到10FFFF的字碼空間(百萬個碼位)。
UTF-32 原本是 UCS-4 的子集,但JTC1/SC2/WG2聲明,所有未來對字元的指定都將會限制在BMP及其14個補充平面。
於是就現狀而言,除了 UTF-32 標準包含額外的 Unicode 意涵,UCS-4 和 UTF-32 大體是相同的。

註記:以上資料來自維基百科。

沒有留言

技術提供:Blogger.