何謂UTF-8、UTF-16及UTF-32
- 十月 2nd, 2009
- Posted in 電腦兩三事
- Write comment
繼上一篇文章「Big5碼與Unicode碼之差異性」之後,在留言的部份子靖尋問到,何謂「UTF-8」,所以在本篇中,也將以淺顯易懂的方式來向各位說明。
「何謂UTF-8、UTF-16及UTF-32」
什麼是UTF-8?其實在Wiki中有寫到,UTF是Unicode Transformation Format的縮寫,如就字面上翻譯的話是「Unicode轉換格式」。而數字8則表示是用八個位元所組成的編碼,16就表示用十六個位元組成。如用簡單點的方式來說明這幾種格式的話,UTF-8、UTF-16及UTF-32都是用來表示Unicode的一種儲存格式。
「儲存格式」
在上述Wiki的文章內有提到,UTF-8是一種可變長度的編碼,為什麼說是可變長度,下列我將用一張表格來進行介紹UTF格式在不同編碼規則中所需的儲存大小。因Unicode所包含的範圍實在太廣,所以還是以中文的範圍進行說明。

基本上UTF-8不管在哪一個範圍,都會有長度上的變動,或許有人會問到,那儲存成UTF-8或UTF-16有什麼差別呢?下面將做一個簡單的示範來說明差異性,在純文字檔案格式內,儲存一百個相同字型並屬於Unicode Extension A的範圍,儲存成UTF-8及16格式,如下圖所示,UTF-8及16的header分別為3 byte及2 byte,所以兩者果然差了100 byte。

「BE、LE、BOM?!」
本以為沒人會看,所以想偷懶一下,既然有人問到了,就順便把它加進文章來,BE是Big-Endian的縮寫,而LE是Little-Endian的縮寫,這兩個縮寫代表什麼意思呢?以下我們將以「堃」為例,堃的unicode碼為5803,如將文件儲存成LE格式的話則會顯示「03 58」,也就是預設Windows的儲存格式,如存成BE則為「58 03」,像IBM、HP大型主機的格式。
BOM是byte-order mark的縮寫,中文叫「位元組順序記號」,想知道詳細的部份,可以參考Wiki,簡單說的話呢,BOM就是用來表示文件是儲存成何種Unicode格式的,因為UTF-8沒有順序的問題,所以我將就UTF-16做說明,如將文件儲存成UTF-16 (LE有BOM)時,並用二進位編輯器開啟時,會看到前會帶了「FE FF」的記號,而無BOM格式,就是將前端的記號拿掉,而這功能主要是用在傳輸時判斷來源檔案格式用的。
「效能」
可能有人會想做這種測試有什麼意義呢?如果我們把數千億筆的資料放到database裡可就有很大的差別了,同時也出現另一個問題,由於UTF-8是可變長度,所以「有可能」會使用較少的儲存空間,但也是因為為可變長度,所以資料庫的效能也較UTF-16及UTF-32來的差。
「murmur」
在寫完這篇文章後的不久,hugo也要離開目前所就職的公司,一切相關的知識都是從這裡開始,也從來沒想過有天會打滾在各種語系編碼當中,最後我還是要感謝一下教授我各種唬爛專業知識的ya老闆。最後如果您對於此文章有任何的問題及指教,都歡迎留言給我。






照這描述看起來,UTF-8似乎是比較先進的規格囉?
是的,比較不會有所謂當地語系的問題。
沒想到有人問這問題,看來不能偷懶了,我已經將概述增加到文章當中了,至於ID3我還真的沒用過,如果您還有任何的問題,都可以留言給我。
不好意思,我想請教一下,像筆記本存unicode就有一些不同
筆記本存unicode是UTF-16LE(含BOM)
存unicode big endian是UTF-16BE(含BOM)
不知LE、BE和BOM代表是什麼意思?
而在ID3裡面,好像有沒有BOM就有差別的樣子?
謝謝