UTF8、UTF16、UTF16-LE、UTF16-BE、UTF32都是些什么?


下述內容大部分引用自CSDN

Unicode 是 unicode.org 制定的編碼標准,目前得到了絕大部分操作系統和編程語言的支持。unicode.org 官方對 Unicode 的定義是:Unicode provides a unique number for every character, no matter what the platform, no matter what the program, no matter what the language。可見,Unicode 所做的是為每個字符定義了一個相應的數字表示。比如,“a”的 Unicode 值是 0x0061,“一”的 Unicode 值是 0x4E00,這是最簡單的情況,每個字符用2個字節表示。

unicode.org 定義了百萬個以上的字符,如果將所有的字符用統一的格式表示,需要的是 4 個字節。“a”的 Unicode 表示就會變成 0x00000061,而“一“的 Unicode 值是 0x00004E00。實際上,這就是 UTF32,Linux 操作系統上所使用的 Unicode 方案。

但是,仔細分析可以發現,其實絕大部分字符只使用 2 個字節就可以表示了。英文的 Unicode 范圍是 0x0000-0x007F,中文的 Unicode 范圍是 0x4E00-0x9F**,真正需要擴展到 4 個字節來表示的字符少之又少,所以有些系統直接使用 2 個字節來表示 Unicode。比如 Windows 系統上,Unicode 就是兩個字節的。對於那些需要 4 個字節才能表示的字符,使用一種代理的手法來擴展(其實就是在低兩個字節上做一個標記,表示這是一個代理,需要連接上隨后的兩個字節,才能組成一個字符)。這樣的好處是大量的節約了存取空間,也提高了處理的速度。這種 Unicode 表示方法就是 UTF16。一般在 Windows 平台上,提到 Unicode,那就是指 UTF16 了。

至於 UTF16-LE 和 UTF16-BE,則與計算機的 CPU 構架有關。LE 指 Little Endian,而 BE 指 Big Endian。由於 UTF16 是雙字節編碼,所以兩個字節保存時哪個在前,哪個在后關系到解析出字符的結果。至於為什么會出現 BE 和 LE 的編碼,則是由於歷史原因造成的:在 Mac 和 PC 機上,對字節順序的理解是不一致的。如果一個文件不明確說明 UTF16 使用的是 BE 還是 LE,那么就需要通過 BOM 來指明了。我們一般的 X86 系統都是 Little Endian 的,可以認為 UTF16=UTF16-LE。

由於對於歐洲和北美,實際上使用的編碼范圍在 0x0000-0x00FF 之間,只需要一個字符就可以表示所有的字符。即使是使用 UTF16 來作為內存的存取方式,還是會帶來巨大的空間浪費,因此就有了 UTF8 的編碼方式。UTF8 是一個可變長度字符編碼,它同時是一個前綴碼,前綴碼的特征是,編碼系統中的任意一個合法的碼不會是另外一個碼的前綴,所以 UTF8 不需要指定字節序。一個 UTF8 編碼可以用 1~6 個字節來表示,將第一個字節的前幾個比特設置為 1 來指定這個字符占用幾個比特,比如一個兩字節的字符的編碼,第一位是 110xxxxx,第二位是 10xxxxxx,而一個六字節字符的編碼是這樣的:1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx,所以 UTF-8 最多能編碼 231 個字符。所以對於只需要1個字節的字符,就使用一個字節。對於中日韓等原本需要兩個字節才能表示的字符,則通過一個UTF16-UTF8 的算法實現相互之間的轉換,一般需要 3 個字節才能表示。UTF8 使用的算法很有意思,大致映射關系如下:

Unicode編碼 UTF-8編碼(二進制)
U+0000 – U+007F 0xxxxxxx
U+0080 – U+07FF 110xxxxx 10xxxxxx
U+0800 – U+FFFF 1110xxxx 10xxxxxx 10xxxxxx
U+10000 – U+10FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

由於 UTF8 可以方便的轉換為 UTF16 和 UTF32,而且 UTF8 在每個操作系統平台上的實現都是一樣的,也不存在跨平台的問題,所以 UTF8 成為跨平台的 Unicode 很好的解決方案。當然,對於中文來說,由於每個字符需要 3 個字節才能表示,還是有點浪費的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM