[萬能] UTF-8 與 Unicode

看板 Key_Mou_Pad
作者 Tiberius (小敗踢)
時間 2006-03-04 13:32:26
留言 10則留言 (7推 0噓 3→)

看到有些人混用 UTF-8 與 Unicode, 想想還是出來澄清一下 「這兩個東西是不一樣的」 UTF-8 的 "UTF" 指的是 "Unicode Transformation Format", "Unicode 變換格式" 這是一種儲存 Unicode 字元的編碼方式 (下面為了說明方便起見, 以 U+ 開頭的是 Unicode 的字碼, 0x 開頭的是一般的 bytes 編碼) 為什麼要轉換編碼呢? 理由有好幾個: 1. Unicode 一個字的字碼長 32 bits, 拿來表示英文字太浪費了 (這是主要理由) 原本在 ASCII 範圍內的字, Unicode 沒有改變編碼 0x00 到 0x7F 直接對應 U+00000000 到 U+0000007F 直接傳 Unicode 的話, 就是一堆浪費空間的 0 ... 2. Unicode 字碼在網路上傳送的時候很難同步, 傳爛一個 byte, 後面就全毀了 因為每個 byte 都有可能是 0x00 到 0xFF (第一個 byte 例外, 0x00 - 0x7F) 只要錯漏了一個 byte, 就不知道該從哪邊開始抓 4 bytes 當成一個字解碼啦 因此後來發展出許多編碼形式, 以便節省資料空間, 方便在網路上傳送 其中最常用到的編碼方式是 UTF-8, 它受歡迎的原因有下列幾個 1. 原本的 ASCII 範圍字元 (U+0000 到 U+007F) 儲存方法一樣, 不必改變 所以純英文的 ASCII 文字檔就是合法的 UTF-8 文字檔 2. 編碼結果裡面不會用到 Null (0x00), \ (0x5C) 與 0xFF 有寫程式的就知道這代表什麼意思 ... 3. UTF-8 可以看得出「哪邊是一個字碼的開始」,所以中間傳爛的話不會壞一整串 比如說, 0xC0 ~ 0xDF 代表這是 2 bytes 字碼的第一個 byte 0xE0 ~ 0xEF 3 bytes 0xF0 ~ 0xF7 4 bytes 0xF8 ~ 0xFB 5 bytes 0xFC ~ 0xFD 6 bytes 然後呢, 0x80 ~ 0xBF 一定是長字碼後面的 bytes 傳爛的話, 很容易就能抓出下一個字從哪邊開始 上面有人拿 "史" 當例子, 它的 UTF-8 編碼是 0xE58FB2, 解回 Unicode 就是 U+53F2 中文 (漢字) 編成 UTF-8 多半需要 3 bytes, 比以往 Big5 稍微肥一點 但是就小弟翻譯的經驗來看 ... 同樣的意義, 英文 (ASCII) 與中文 (UTF-8) 比較 中文佔用的儲存空間還是比較小!! 某種角度來說, 可見中文博大精深啊! XD 感謝讀完, 以後不要再把 Unicode 跟 UTF-8 搞混囉! 尤其是 Unicode (UTF-8) 這種寫法, 很容易造成誤會的. == 追伸 (寫著寫著變成進階閱讀了?) 除了 Unicode 官方文件之外, IETF 也以 RFC2044 -> RFC2279 -> RFC3629 規範 UTF-8. 為什麼要在 UTF-8 後面特別加上 "-8"? 當然是因為還有其它 UTF 啦! XD 比如說 UTF-7 (少用, 專門對付連 8-bit 都不能處理的終端機), UTF-16 (UCS-2), UTF-32 (UCS-4) 等等 這邊又出現新縮寫了, UCS = "Universal Character Set" 指的是 ISO 10646 這個國際標準 ISO 10646 "不等於" Unicode, 兩邊有著錯綜複雜的歷史淵源 ... 不過請有興趣的人自己查吧, 這邊不談政治 XD 原本 UCS-2 可直接對應 ISO 10646 的第 0 面 (Plane 0) 不需再次編碼 也就是 "基本多語系字面" (BMP; Basic Multilingual Plane) 但是後來發現, 區區六萬個碼位根本不夠用, 漢字之多啊 ... XD 隨著 Unicode 擴充, ISO 10646-1:2000 / Unicode 3.0 / RFC2781 制定了 UTF-16 以便在大致相容 UCS-2 的情形下表示所有 Unicode 字元 (每字 31 bits) 不必編碼的表示方式, 就由 UCS-4 (UTF-32) 負責承接了. 說到這個, Unicode 把漢字資料整理得不錯, 有個 Unihan Database 可以看 每個漢字的筆劃數、各國寫法 (簡繁日韓)、各國發音 (廣東,國語,唐朝,音讀,訓讀)、 各國字典部首排序 (康熙,大漢和,漢語大字典)、漢字意義 ... (例: http://0rz.net/da16Z) 最重要的是 ... 有放公開下載, 而且是很容易用程式處理的格式!!! XD 書翻完之後就用這個來做 MySQL 的中文部首、拼音、筆劃排序吧 (這個有沒有人有興趣? 有的話寄個站內信給我, 光寫「有」一個字也好 XD?) -- ◆ From: 211.74.178.119
※ 批踢踢實業坊(ptt.cc)
※ 文章網址: https://www.ptt.cc/bbs/Key_Mou_Pad/M.1141446896.A.775.html

solaris10:請問什麼叫做「MySQL 的中文部首、拼音、筆劃排序」? 03/04 13:53

solaris10:像這樣的程式嗎? http://tinyurl.com/plfg3 03/04 13:55

Tiberius:就是可以 ORDER BY 中文欄位, 依照筆畫順序顯示資料 03/04 13:58

Tiberius:您推的這個也是 Unihan Database 呀! XD 03/04 14:00

solaris10:因為前兩個禮拜剛好在研究 unihan,所以看了很多網站 03/04 14:03

PsMonkey:..... [抬頭] .... [抬頭] .... [筆記ing] 03/04 14:11

rockzero:推~~對號入座一下 :) 03/04 14:12

bluepc:推~~ :P 03/04 14:35

blc:UTF-7的話,我的手機(k700i)有用到… 03/04 15:23

ithinkurdumb:nice 03/04 17:47

您可能感興趣