unicode編碼 unicode字符大全下載
當天下午
————————
在計算機底層,比如說你的名字“小萌”在計算機中并不是文字的形式,而是一串二進制數字,如“011001100110…”
人類只認識文字,可惜計算機只認0和1,雙方都不能妥協,那就必須要有一個從文字到0、1的映射了。
從我們可以看到的文字到0、1的映射稱為編碼,反過來從0、1到文字叫解碼。這個就是編碼的含義。
因為計算機只能處理數字,如果要處理文本,就必須先把文本轉換為數字才能處理。最早的計算機在設計時采用8個比特(bit)作為一個字節(byte),所以,一個字節能表示的最大的整數就是255(二進制11111111=十進制255),0 - 255被用來表示大小寫英文字母、數字和一些符號,這個編碼表被稱為ASCII編碼,比如大寫字母A的編碼是65,小寫字母z的編碼是122。
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 位的碼元來編碼的。
UTF-8 使用一到四個字節來編碼一個碼點。從 0 到 127 的這些碼點直接映射成 1 個字節(對于只包含這個范圍字符的文本來說,這一點使得 UTF-8 和 ASCII 完全相同)。接下來的 1,920 個碼點映射成 2 個字節,在 BMP 里所有剩下的碼點需要 3 個字節。Unicode 的其他平面里的碼點則需要 4 個字節。UTF-8 是基于 8 位的碼元的。UTF-8 是基于 8 位的碼元的,因此它并不需要關心字節順序(因為字節就是8位的呀,其它UTF-16和UTF-32在不同的機器編譯環境下需要考慮字節的順序問題)
作者:喬戈里 轉載自:公眾號,程序員喬戈里,已獲作者授權