什麽是UTF8?

UTF8並不算是一種電腦編碼,而是一種儲存和傳送的格式,如前所述,每個Unicode/UCS字符都以 2或4個bytes來儲存,看看以下的比較:

以"I am Chinese"爲例

用ANSI儲存:12 Bytes

用Unicode/UCS2儲存:24 Bytes + 2 Bytes(header)

用UCS4儲存:48 Bytes + 4 Bytes(header)

以"我是中國人"爲例

用ANSI儲存:10 Bytes

用Unicode/UCS2儲存:10 Bytes + 2 Bytes(header)

用UCS4儲存:20 Bytes + 4 Bytes(header)

由此可見直接以Unicode/UCS的原始形式來儲存是一種極大的浪費,而且也不利于互聯網的傳輸(中文稍爲合算一點^_^)。

有見及此,Unicode/UCS的壓縮形式--UTF8出現了,套用官方網站的首句話『UTF-8 stands for Unicode Transformation Format-8. It is an octet (8-bit) lossless encoding of Unicode characters.』,由于UTF也適用于編碼UCS,故亦可稱爲『UCS transformation formats (UTF)』

UTF8是以8bits即1Bytes爲編碼的最基本單位,當然也可以有基于16bits和32bits的形式,分別稱爲UTF16和UTF32,但目前用得不多,而UTF8則被廣泛應用在文件儲存和網絡傳輸中。

編碼原理

先看這個模板:

UCS-4 range (hex.) UTF-8 octet sequence (binary)

0000 0000-0000 007F 0xxxxxxx

0000 0080-0000 07FF 110xxxxx 10xxxxxx

0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx

0001 0000-001F FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

0020 0000-03FF FFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

0400 0000-7FFF FFFF 1111110x 10xxxxxx ... 10xxxxxx

編碼步驟:

1) 首先確定需要多少個8bits(octets)

2) 按照上述模板填充每個octets的高位bits

3) 把字符的bits填充至x中,字符順序:低位→高位,UTF8順序:最後一個octet的最末位x→第一個octet最高位x

4) 解碼的原理一樣。

實例:(留意每個bit的顔色,粗體字爲模板內容)

UCS-4 UTF-8

HEX BIN Bytes BIN HEX Bytes

0000 000A 00001010 4 00001010 0A 1

0000 0099 10011001 4 11000010 10011001 C2 99 2

0000 8D99 10001101 10011001 4 11101000 10110110 10011001 E8 B6 99 3

不知大家看懂了沒有,其實不懂也無所謂,反正又不用自己算,程式可以完全代勞。

以UTF8格式儲存的文件檔首標識爲EF BB BF。

效率

從上述編碼原理中得出的結論是:

1.每個英文字母、數字所占的空間爲1 Byte;

2.泛歐語系、斯拉夫語字母占2 Bytes;

3.漢字占3 Bytes。

由此可見UTF8對英文來說是個非常誘人的方案,但對中文來說則不太合算,無論用ANSI還是 Unicode/UCS2來編碼都只用2 Bytes,但用UTF8則需要3 Bytes。

以下是一些統計資料,顯示用UTF8來儲存文件每個字符所需的平均字節:

1.拉丁語系平均用1.1 Bytes;

2.希臘文、俄文、阿拉伯文和希伯萊文平均用1.7 Bytes;

3.其他大部份文字如中文、日文、韓文、Hindi(北印度語)用約3 Bytes;

4.用超過4 Bytes的都是些非常少用的文字符號。

 
在Java中將數據由UTF8轉換成GB2312格式
UTF8轉換成GB2312 當我們在基于HTTP協議的JSP或Servlet的應用中獲取數據或發送請求時,JVM會把輸送的數據編碼成UTF8格式。如果我們直接從HTTP流中提取中文數據,提取的結果爲“????”(可能更多問號),爲轉換成我們...查看完整版>>在Java中將數據由UTF8轉換成GB2312格式
 
Java中將數據由UTF8轉換成GB2312格式
UTF8轉換成GB2312 當我們在基于HTTP協議的jsp或Servlet的應用中獲取數據或發送請求時,JVM會把輸送的數據編碼成UTF8格式。...查看完整版>>Java中將數據由UTF8轉換成GB2312格式
 
手機上通用的UTF8轉換程序
最近發現Java的UTF轉換函數有BUG,在某些手機上(如K700)會出現亂碼,與是上網查詢了一下,在國外論壇上找到了一個UTF8轉換函數,在我們公司所有測試機上都能正常轉換,覺得效果還可以 private final String re...查看完整版>>手機上通用的UTF8轉換程序
 
教你如何解決453h安裝在mysql 4.1 以上的UTF8數據庫中造成的亂碼和安裝失敗問題
這幾天在嘗試安裝mambo 4.53h版, 由于我的數據庫是mysq4.1以上版本,並且設定的字符集是UTF8 。在嘗試安裝了幾次後發現以下幾種情況:1. 將數據庫設置爲 latin1 , 不修改任何文件,在安裝時無論選擇gb2312 還是utf...查看完整版>>教你如何解決453h安裝在mysql 4.1 以上的UTF8數據庫中造成的亂碼和安裝失敗問題
 
UTF8下的中文PHP編程
前言:說實話,涼鞋也覺得 UTF8 是好東西……畢竟同屏顯示中日韓對東亞人的吸引力是不小的……(當然好處不僅是這點啦……)不僅是網頁程式……很多應用程式的內核都開始使用 Unicode 編碼……目的是顯而易見的:支援...查看完整版>>UTF8下的中文PHP編程