![什麼是字符集和編碼?ASCII、UTF-8、UTF-16、UTF-32 又是什麼?](http://p2.ttnews.xyz/loading.gif)
![什麼是字符集和編碼?ASCII、UTF-8、UTF-16、UTF-32 又是什麼?](http://p2.ttnews.xyz/loading.gif)
當天下午
————————
在計算機底層,比如說你的名字“小萌”在計算機中並不是文字的形式,而是一串二進制數字,如“011001100110…”
人類只認識文字,可惜計算機只認 0 和 1,雙方都不能妥協,那就必須要有一個從文字到 0、1 的映射了。
從我們可以看到的文字到 0、1 的映射稱為編碼,反過來從 0、1 到文字叫解碼。這個就是編碼的含義。
Unicode 編碼定義了這個世界上幾乎所有字符(就是你眼睛看的字符,比如ABC、漢字等)的數字表示,而且 Unicode 還兼容了很多老版本的編碼規範,例如剛剛講過的 ASCII 碼。
我們國家的每一個人都對應唯一的一個身份證號,而 Unicode 也為每個字符發了一張身份證,這張“身份證”上有一串唯一的數字 ID 確定了這個字符。
這串數字在整個計算機的世界具有唯一性,Unicode 給這串數字 ID 起了個名字叫[碼點]。
這個“Unicode 轉換格式”是為了解決“碼點”在計算機存儲方式而設計的。
“碼點”經過映射後得到的二進制串的轉換格式單位稱之為“碼元”(Code Unit)。“碼點”就是一串二進制數,“碼元”就是切分這個二進制數的方法。
舉個例子,如果有一個字符的碼點二進制表示有 n 字節(n*8 個二進制數),其碼元為 8 位(1 個字節),那麼其擁有碼元 n 個。
Unicode 編碼發展到今天擴展到了 21 位,為啥擴展到 21 位了呢?因為一開始老美只考慮自己那 26 個英文字母和數字,隨著越來越多的國家的語言語言編碼,Unicode 不得繼續擴展,目前 21 位已經足夠使用。
UTF-32 是最好理解的一個了。UTF-32 也就是說它的碼元是 32 位,每 32 位去讀一下碼點,而碼點是 Unicode 給字符的編碼,前面也說了,最長才 21 位,因此每一個 UTF-32 值都可以直接表示對應的碼點。
什麼是編碼空間呢?前面說了 Unicode ,它是 21 位的。這 21 位提供了 1,114,112 個碼點,編碼空間就是對應這 1,114,112 個碼點。
對了這裡要說一下,這麼多碼點並不代表有這麼多字符,目前大概只有 10% 的空間被使用了,人類社會還沒創造出 1,114,112 這麼多的字符。
編碼空間被分成 17 個平面(plane),每個平面有 65,536 個字符(正好填充 2 個字節,16 位)。0 號平面叫做“基本多文種平面”(BMP, Basic Multilingual Plane),涵蓋了幾乎所有你能遇到的字符,除了 emoji(emoji 位於 1 號平面 - -)。其它平面叫做補充平面,大多是空的。UTF-16 要常見得多,它的碼元是 16 位的,也就是說每 16 位去讀一下碼點,獲取碼點的前 16 位數字,直到讀取完成。
編碼空間這裡要用上了哈,BMP 平面(也就是前面說的基本多文種平面)中的每一個碼點都直接與一個 UTF-16 的碼元一一映射。
由於 BMP 幾乎包括了所有常見字符,UTF-16 一般需要 UTF-32 大約一半的空間。至於其它平面裡很少使用的碼點都是用兩個 16 位的碼元來編碼的。
閱讀更多 cpp軟件架構獅 的文章