以前看《Java核心技術 卷I》,看到了3.6.5節 代碼點和代碼單元,看了幾遍但是沒有徹底明白。直達最近發現一篇網絡文章:https://github.com/acmerfight/insight_python/blob/master/Unicode_and_Character_Sets.md, 其中對編碼歷史進行了回顧,指出了代碼點和代碼單元出現的原因,讓我對代碼點和代碼單元有了清晰的理解。
代碼點(Code Point):Unicode是屬於編碼字符集(CCS)的范圍。Unicode所做的事情就是將我們需要表示的字符表中的每個字符映射成一個數字,這個數字被稱為相應字符的碼點(code point)。例如“嚴”字在Unicode中對應的碼點是U+0x4E25。
代碼點是字符集被編碼后出現的概念。字符集(Code Set)是一個集合,集合中的元素就是字符,比如ASCII字符集,其中的字符就是'A'、'B'等字符。為了在計算機中處理字符集,必須把字符集數字化,就是給字符集中的每一個字符一個編號,計算機程序中要用字符,直接用這個編號就可以了。於是就出現了編碼后的字符集,叫做編碼字符集(Coded Code Set)。編碼字符集中每一個字符都和一個編號對應。那么這個編號就是代碼點(Code Point)。
代碼單元(Code Unit):是指一個已編碼的文本中具有最短的比特組合的單元。對於UTF-8來說,代碼單元是8比特長;對於UTF-16來說,代碼單元是16比特長。換一種說法就是UTF-8的是以一個字節為最小單位的,UTF-16是以兩個字節為最小單位的。
代碼單元是把代碼點存放到計算機后出現的概念。一個字符集,比如有10個字符,每一個字符從0到9依次編碼。那么代碼點就是0、1、。。。、9。為了在計算機中存儲這10個代代碼點,一個代碼點給一個字節,那么這里的一個字節就是一個代碼單元。比如Unicode是一個編碼字符集,其中有65536個字符,代碼點依次為0、1、2、。。。、65535,為了在計算機中表示這些代碼點就出現了代碼單元,65536個代碼點為了統一表示每個代碼點必須要有兩個字節表示才行。但是為了節省空間0-127的ASCII碼就可以不用兩個字節來表示,只需要一個字節,於是不同的表示方案就形成了不同的編碼方案,比如utf-8、utf-16等。對utf-8而言代碼單元就是一個字節,對utf-16而言代碼單元就是兩個字節。