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

UTF-8

鎖定
UTF-8(8位元,Universal Character Set/Unicode Transformation Format)是針對Unicode的一種可變長度字符編碼。它可以用來表示Unicode標準中的任何字符,而且其編碼中的第一個字節仍與ASCII相容,使得原來處理ASCII字符的軟件無須或只進行少部分修改後,便可繼續使用。因此,它逐漸成為電子郵件、網頁及其他存儲或傳送文字的應用中,優先採用的編碼。
中文名
UTF-8
外文名
UTF-8, a transformation format of ISO 10646
定    義
針對Unicode的可變長度字符編碼
作    者
Ken Thompson
作    者
Rob Pike(羅布·派克)
創建時間
1992年09月
所屬領域
計算機科學技術
現行標準號
RFC 3629 a.k.a. STD 63

UTF-8發展歷程

在所有字符集中,最知名的可能要數被稱為ASCII的8位字符集了。它是美國標準信息交換代碼(American Standard Code for Information Interchange)的縮寫, 為美國英語通信所設計。它由128個字符組成,包括大小寫字母、數字0-9、標點符號、非打印字符(換行符製表符等4個)以及控制字符(退格、響鈴等)組成。
但是,由於它是針對英語設計的,當處理帶有音調標號(形如漢語的拼音)的亞洲文字時就會出現問題。因此,創建出了一些包括256個字符的由ASCII擴展的字符集。其中有一種通常被稱為IBM字符集,它把值為128-255之間的字符用於畫圖和畫線,以及一些特殊的歐洲字符。另一種8位字符集是ISO 8859-1Latin 1,也簡稱為ISOLatin-1。它把位於128-255之間的字符用於拉丁字母表中特殊語言字符的編碼,也因此而得名。歐洲語言不是地球上的唯一語言,因此亞洲和非洲語言並不能被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(敍利亞語)之類的古老文字。
Unicode只是一組字符設定或者説是從數字和字符之間的邏輯映射的概念編碼,但是它並沒有指定代碼點如何在計算機上存儲。UCS4、UTF-8、UTF-16(UTF後的數字代表編碼的最小單位,如UTF-8表示最小單位1字節)
在Unicode官方資料中,Unicode的編碼方式有三種 [3]  :UTF-8、UTF-16UTF-32。由於UTF-8與字節序無關(無需BOM),同時兼容ASCII編碼,使得UTF-8編碼成為現今互聯網信息編碼標準而被廣泛使用。

UTF-8基本特徵

UCS字符U+0000到U+007F(ASCII)被編碼為字節0x00到0x7F(ASCII兼容)。這意味着只包含7位ASCII字符的文件在ASCII和UTF-8兩種編碼方式下是一樣的。
所有大於0x007F的UCS字符被編碼為一個有多個字節的串,每個字節都有標記位集。因此,ASCII字節(0x00-0x7F)不可能作為任何其他字符的一部分。表示非ASCII字符的多字節串的第一個字節總是在0xC0到0XFD的範圍裏,並指出這個字符包含多少個字節。多字節串的其餘字節都在0x80到0xBF範圍裏。這使得重新同步非常容易,並使編碼無國界,且很少受丟失字節的影響。
UTF8分成單字節、雙字節、三字節、四字節模式 [4]  。UTF-8編碼字符理論上可以最多到4個字節長,然而16位BMP字符最多隻用到3字節長,Bigendian UCS-4字節串的排列順序是預定的,字節0xFE和0xFF在UTF-8編碼中從未用到。

UTF-8編碼字節數

UTF-8使用1~4字節為每個字符編碼
·一個US-ASCIl字符只需1字節編碼(Unicode範圍由U+0000~U+007F)。
·帶有變音符號拉丁文希臘文西裏爾字母亞美尼亞語希伯來文阿拉伯文敍利亞文等字母則需要2字節編碼(Unicode範圍由U+0080~U+07FF)。
·其他語言的字符(包括中日韓文字、東南亞文字、中東文字等)包含了大部分常用字,使用3字節編碼。
·其他極少使用的語言字符使用4字節編碼。

UTF-8字符集

UTF-8編碼規則:如果只有一個字節則取值為0x00-0x7F。其餘字節按長度進行以下拓展:
UTF-8由4種編碼方式實現,即UTF8-1 / UTF8-2 / UTF8-3 / UTF8-4 [2]  。其中:
UTF8, 16進制編碼表
UTF8-1
0x00-0x7F
UTF8-2
0xC2-0xDF 0x80-0xBF
UTF8-3
0xE0 0xA0-0xBF 0x80-0xBF
0xE1-0xEC 0x80-0xBF 0x80-0xBF
0xED 0x80-0x9F 0x80-0xBF
0xEE-0xEF 0x80-0xBF 0x80-0xBF
UTF8-4
0xF0 0x90-0xBF 0x80-0xBF 0x80-0xBF
0xF1-0xF3 0x80-0xBF 0x80-0xBF 0x80-0xBF
0xF4 0x80-0x8F 0x80-0xBF 0x80-0xBF
注:每種編碼可能有多個編碼範圍,每個編碼範圍間,以空格作為每個字節的分隔符。例如UTF8-3的第一個編碼,其第一個字節取值必須為0xE0,第二個字節範圍為0xA0-0xBF,第三個字節為0x80-0xBF。

UTF-8優缺點

UTF-8優點

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

UTF-8缺點

你無法從UNICODE字符數判斷出UTF-8文本的字節數,因為UTF-8採用的是不定長的編碼方式。
它需要用2個字節編碼那些用擴展ASCII字符集只需1個字節的字符 ISO Latin-1 是UNICODE的子集,但不是UTF-8的子集 8位字符的UTF-8編碼會被email網關過濾,因為internet信息最初設計為7位ASCII碼。因此產生了UTF-7編碼。 UTF-8 在它的表示中使用值100xxxxx的幾率超過50%, 而現存的實現如ISO 2022, 4873, 6429, 和8859系統,會把它錯認為是C1 控制碼。因此產生了UTF-7.5編碼。 [1] 
參考資料