什麽是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編程
 
解決MYSQL後台utf8編碼,前台頁面顯示錯誤的問題
在前台頁面裏面,從數據庫中選擇出來的數據表中文項目,有的是正確的編碼顯示,有的是錯誤的亂碼,分析後知道,原因可能有3種:1. mysql_server 的語言環境應該爲zh_CN.GBK ,同時數據庫的環境變量中要把各個數據庫中...查看完整版>>解決MYSQL後台utf8編碼,前台頁面顯示錯誤的問題
 
gbk,utf8,左右爲難
  看《O’Reilly Upgrading to PHP 5》的時候,心血來潮,把MYSQL升級到了4.1.11,由于機器上沒有什麽正式系統,也就沒有注意到它字符集的變化。後來就把正式應用的系統也給升級了,升級之後其它系統都沒問題,唯獨...查看完整版>>gbk,utf8,左右爲難
 
utf8
  程序包見附件  也可參考  http://quijote.blog@bbs.nju.edu.cn  作 者: quijote  標 題: python程序中的中文字符處理(2003.7.11)  時 間: Wed Jun 11 10:47:43 2003  點 擊: 22  抛磚引玉  這...查看完整版>>utf8
 
讓Mplayer GUI支持UTF8編碼
不是什麽新技術了,只是一直沒時間寫,這幾天剛裝了FC4,順便重裝了Mplayer,因爲現在幾乎所有的發行版都用UTF8作爲默認編碼了,僅將此文獻給不知道如何讓mplayer在utf8語言環境下顯示中文菜單的朋友。首先,Mplayer...查看完整版>>讓Mplayer GUI支持UTF8編碼
 
 
回到王朝網路移動版首頁