-
UTF-8
鎖定
- 中文名
- 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-16、UTF-32。由於UTF-8與字節序無關(無需BOM),同時兼容ASCII編碼,使得UTF-8編碼成為現今互聯網信息編碼標準而被廣泛使用。
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)。
·其他極少使用的語言字符使用4字節編碼。
UTF-8字符集
UTF-8編碼規則:如果只有一個字節則取值為0x00-0x7F。其餘字節按長度進行以下拓展:
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-16或UTF-32文本。
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]
- 參考資料
-
- 1. UTF-8 and Unicode FAQ for Unix/Linux .百度學術[引用日期2019-05-29]
- 2. RFC 3629: UTF-8, a transformation format of ISO 10646 .RFC Editor.2003-11-01[引用日期2021-04-26]
- 3. The Unicode® Standard, Version 14.0, Conformance .Unicode.2021-09-01[引用日期2022-01-26]
- 4. UTF8格式簡介 .CSDN[引用日期2022-07-18]