複製鏈接
請複製以下鏈接發送給好友

UTF

鎖定
UTF,是Unicode Transformation Format的縮寫,意為Unicode轉換格式
其中,UTF-8是UTF中最常用的轉換格式,是UNICODE的一種變長字符編碼,由Ken Thompson於1992年創建。現在已經標準化為RFC 3629。UTF-8用1到6個字節編碼UNICODE字符。
中文名
Unicode轉換格式
外文名
Unicode Transformation Format (UTF)
類    型
轉換格式

UTF簡介

UTF,是UnicodeTransformationFormat的縮寫,意為Unicode轉換格式
如果UNICODE字符由2個字節表示,則編碼成UTF-8很可能需要3個字節,而如果UNICODE字符由4個字節表示,則編碼成UTF-8可能需要6個字節。用4個或6個字節去編碼一個UNICODE字符可能太多了,但很少會遇到那樣的UNICODE字符。

UTF簡史

UTFASCII碼

在所有字符集中,最知名可能要數被稱為ASCII的7位字符集了。它是美國信息交換標準委員會(American Standard Code for Information Interchange)的縮寫,為美國英語通信所設計。它由128個字符組成,包括大小寫字母、數字0-9、標點符號、非打印字符(換行符製表符等4個)以及控制字符(退格、響鈴等)組成。標準的ASCII碼用一個字節存儲,可以表示128個字符,其中最高位用作校驗碼

UTF擴展碼

但是,由於他是針對英語設計的,當處理帶有音調標號(形如漢語的拼音)的歐洲文字時就會出現問題。為了表示更多字符,人們打起了校驗碼的注意,讓最高位也用作字符表示,這就是ASCII碼擴字符集。ASCII擴展的字符集包括255個字符。其中有一種通常被稱為IBM字符集,它把值為128-255之間的字符用於畫圖和畫線,以及一些特殊的歐洲字符。另一種8位字符集是ISO 8859-1Latin 1,也簡稱為ISO Latin-1。它把位於128-255之間的字符用於拉丁字母表中特殊語言字符的編碼,也因此而得名。

UTF編碼

歐洲語言不是地球上的唯一語言,因此亞洲非洲語言並不能被8位字符集所支持。僅漢語(或pictograms)字母表就有80000以上個字符。但是把漢語、日語和越南語的一些相似的字符結合起來,在不同的語言裏,使不同的字符代表不同的字,這樣只用2個字節就可以編碼地球上幾乎所有地區的文字。因此,創建了UNICODE編碼。它通過增加一個高字節對ISO Latin-1字符集進行擴展,當這些高字節位為0時,低字節就是ISO Latin-1字符。UNICODE支持歐洲、非洲、中東、亞洲(包括統一標準的東亞象形漢字和韓國象形文字)。但是,UNICODE並沒有提供對諸如Braille、Cherokee、Ethiopic、Khmer、Mongolian、Hmong、Tai Lu、Tai Mau文字的支持。同時它也不支持如Ahom、Akkadian、Aramaic、Babylonian Cuneiform、Balti、Brahmi、Etruscan、Hittite、Javanese、Numidian、Old Persian Cuneiform、Syrian之類的古老的文字。

UTF轉換格式

事實證明,對可以用ASCII表示的字符使用UNICODE並不高效,因為UNICODE比ASCII佔用大一倍的空間,而對ASCII來説高字節的0對他毫無用處。為了解決這個問題,就出現了一些中間格式的字符集,他們被稱為通用轉換格式,即UTF(Unicode Transformation Format)。目前存在的UTF格式有:UTF-7,UTF-7.5,UTF-8UTF-16,以及 UTF-32。本文討論UTF-8字符集的基礎。

UTFIE亂碼

UNICODE(UTF-8)這個項目放在 IE的菜單欄下是為了讓你能夠強制 IE用 UTF-8字符集顯示頁面。
只有在頁面編碼為UTF-8但 IE卻無法正確地選擇UTF-8字符集來顯示頁面的時候,你才應該動用該項目。
如果你選擇該項目,這個頁面將被顯示成亂碼,因為這個頁面的編碼是GB2312(簡體中文),不是UTF-8。以不正確的編碼顯示頁面就好像把漢語拼音當成法語來唸,結果當然是沒人能聽懂的亂語。
首先UCSUnicode只是分配整數給字符的編碼表。現在存在好幾種將一串字符表示為一串字節的方法. 最顯而易見的兩種方法是將Unicode文本存儲為2個或4個字節序列的串。這兩種方法的正式名稱分別為UCS-2和UCS-4,除非另外指定,否則大多數的字節都是這樣的(Bigendian convention)。 將一個ASCII或Latin-1的文件轉換成UCS-2只需簡單地在每個ASCII字節前插入0x00。如果要轉換成UCS-4,則必須在每個ASCII字節前插入三個0x00。
在Unix下使用 UCS-2 (或 UCS-4) 會導致非常嚴重的問題。用這些編碼的字符串會包含一些特殊的字符,比如 '\0' 或 '/',它們在文件名和其他C庫函數參數裏都有特別的含義。另外,大多數使用ASCII文件的UNIX下的工具,如果不進行重大修改是無法讀取16位的字符的。基於這些原因,在文件名、文本文件環境變量等地方,UCS-2不適合作為Unicode的外部編碼。
ISO 10646-1 Annex R和RFC 2279裏定義的UTF-8編碼沒有這些問題,它是在Unix風格的操作系統下使用Unicode的明顯的方法。

UTF特性

UCS字符U+0000到U+007F(ASCII)被編碼為字節0x00到0x7F(ASCII兼容),這意味着只包含7位ASCII字符的文件在ASCII和UTF-8兩種編碼方式下是一樣的。
所有>U+007F的UCS字符被編碼為一個多個字節的串,每個字節都有標記位集。因此,ASCⅡ字節(0x00-0x7F)不可能作為任何其他字符的一部分。
表示非ASCⅡ字符的多字節串的第一個字節總是在0xC0到0xFD的範圍裏,並指出這個字符包含多少個字節. 多字節串的其餘字節都在0x80到0xBF範圍裏。這使得重新同步非常容易,並使編碼無國界,且很少受丟失字節的影響。
可以編入所有可能的231個UCS代碼。
UTF-8編碼字符理論上可以最多到6個字節長,然而16位BMP字符最多隻用到3字節長。
Bigendian UCS-4字節串的排列順序是預定的。
字節0xFE和0xFF在UTF-8編碼中從未用到。
下列字節串用來表示一個字符,用到哪個串取決於該字符在 Unicode 中的序號。
U-00000000 - U-0000007F: 0xxxxxxx
U-00000080 - U-000007FF: 110xxxxx 10xxxxxx
U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
xxx的位置由字符編碼數的二進制表示的位填入, 越靠右的x具有越少的特殊意義,只用最短的那個足夠表達一個字符編碼數的多字節串, 注意在多字節串中,第一個字節的開頭"1"的數目就是整個串中字節的數目。
例如: Unicode字符U+00A9 = 1010 1001 (版權符號) 在 UTF-8 裏的編碼為:
11****1*1*1*1**1=0xC20xA9【注:*號代表0】
而字符U+2260 = **1* **1* * 11* **** 【注:*號代表0】(不等於) 編碼為:
111****1* 1*** 1***1 1* 1***** = 0xE2 0x89 0xA0
這種編碼的官方名字拼寫為UTF-8,其中UTF代表UCS Transformation Format,請勿在任何文檔中用其他名字 (比如utf8或UTF_8)來表示UTF-8,當然除非你指的是一個變量名而不是這種編碼本身.

UTF優點

UTF-8編碼可以通過屏蔽位和移位操作快速讀寫。字符串比較時strcmp()和wcscmp()的返回結果相同,因此使排序變得更加容易。字節FF和FE在UTF-8編碼中永遠不會出現,因此他們可以用來表明UTF-16或UTF-32文本(見BOM) UTF-8 是字節順序無關的。它的字節順序在所有系統中都是一樣的,因此它實際上並不需要BOM。

UTF缺點

你無法從UNICODE字符數判斷出UTF-8文本的字節數,因為UTF-8是一種變長編碼它需要用2個字節編碼那些用擴展ASCⅡ字符集只需1個字節的字符 ISO Latin-1是UNICODE的子集,但不是UTF-8的子集8位字符的UTF-8編碼會被email網關過濾,因為internet信息最初設計為7位ASCⅡ碼。因此產生了UTF-7編碼。UTF-8在它的表示中使用值100xxxxx的幾率超過50%, 而現存的實現如ISO 2022,4873,6429和8859系統,會把它錯認為是C1控制碼。因此產生了UTF-7.5編碼。
關於utf-8
java使用UTF-16表示內部文本,並支持用於字符串串行化的非標準的修正UTF-8編碼。標準UTF-8和修正的UTF-8有兩點不同:修正的UTF-8中,null字符編碼成2個字節(11****** 1*******)【注:*號代表0】 而不是標準的1個字節(00000000),這樣作可以保證編碼後的字符串中不會嵌入null字符。因此如果在類C語言中處理字符串,文本不會在第一個null字符時截斷(C字符串以null結尾)。在標準UTF-8編碼中,超出基本多語言範圍(BMP - Basic Multilingual Plain)的字符被編碼為4字節格式,但是在修正的UTF-8編碼中,他們由代理編碼對(surrogate pairs)表示,然後這些代理編碼對在序列中分別重新編碼。結果標準UTF-8編碼中需要4個字節的字符,在修正後的UTF-8編碼中將需要6個字節。