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的都是些非常少用的文字符號。