字符集編碼淺談:Unicode、UTF-8

近期在工作中遇到不少關於字符集問題。如果想要徹底的解決字符集問題, 需要對字符集原理有深入的瞭解。這篇文章主介紹字符編碼涉及的概念,
後續文章會以Java字符編碼作爲切入點,結合代碼範例,詳述Java的字符集,編碼解碼的詳細過程,加深理解!
首先,先了解字符集(CharSet)、編碼方式(Encoding)、字形字體(Font)的概念

一:字符集(CharSet)

charset = char + set,char 是字符,set是集合,charset就是字符的集合。字符集就是是這個編碼方式涵蓋了哪些字符,每個字符映射唯一數字序號。

二:編碼方式(Encoding)

編碼方式就是一個字符要怎樣編碼成二進制字節序,或者反過來怎麼解析。也即給你一個數字序號,要編碼成幾個字節,字節順序如何,如何解碼,或者其他特殊規則。

三:字形字體(Font)

根據數字序號映射到字體字形,就可以在頁面上顯示出來了。所以一個字符要顯示出來,要顯示成什麼樣子要看字體文件。

四:Unicode字符集

最早,Unicode 是爲了解決傳統的字符編碼方案的侷限而產生的,它爲每種語言中的每個字符設定了統一併且唯一的二進制編碼(一個整數),
以滿足跨語言、跨平臺進行文本轉換、處理的要求。
所以,Unicode 只是字符集,而沒有編碼方式。但是要將Unicode字符集應用於計算機傳輸、解析,Unicode有它的致命缺點。
(1) Unicode字符集不兼容ASCII 。ASCII只需要一個字節,Unicode至少需要2個字節。
(2)由於Unicode字符集的編碼長度不確定的,有的字符長度爲2個字節,有的字符長度爲3個字節,這給計算機解碼帶了困難。
於是,UTF-8應運而生,既兼容了ASCII,又解決了Unicode解碼問題!

五:UTF-8編碼

UTF-8是一種可變長的編碼方式,一個字符可映射成1到4個字節。 UTF-8給每個字符映射的二進制碼前加上一個標記,以便識別該字符佔用的字節數,
這樣就成功的解決了Unicode中的解碼問題。
UTF-8 有以下編碼規則:
(1)如果一個字節,最高位(第 8 位)爲 0,表示這是一個 ASCII 字符(00 - 7F)。可見,所有 ASCII 編碼已經是 UTF-8 了。
(2)如果一個字節,以 11 開頭,連續的 1 的個數暗示這個字符的字節數,例如:110xxxxx 代表它是雙字節 UTF-8 字符的首字節。
(3)如果一個字節,以 10 開始,表示它不是首字節,需要向前查找才能得到當前字符的首字節

用一句話總結:unicode是一個字符集,utf8是在這個字符集基礎上的一種具體的編碼方案。utf8解決了unicode字符集的解碼問題。

參考文檔:
https://www.ibm.com/developerworks/cn/java/j-lo-chinesecoding/
https://en.wikipedia.org/wiki/Unicode#Origin_and_development
http://www.zhihu.com/question/23374078

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章