在較早的計(jì)算時(shí)代,ASCII 代碼用于表示字符。英語只有 26 個(gè)字母和一些其他特殊字符和符號。
下表是 ASCII 碼對照表,包含字符及其相應(yīng)的十進(jìn)制和十六進(jìn)制值。
ASCII 碼對照表
從上表可以推斷出,ASCII 值可以在十進(jìn)制數(shù)系統(tǒng)中表示為 0 到 127。讓我們看看 0 和 127 在 8 位字節(jié)中的二進(jìn)制表示。
0 表示為
0 的二進(jìn)制表示
127表示為
127 二進(jìn)制表示
從上面的二進(jìn)制表示可以推斷,十進(jìn)制值 0 到 127 可以使用 7 位來表示,而第 8 位是空閑的。
警告 從這個(gè)地方起,混亂開始了。
人們想出了不同的方法來使用剩余的第八位,從而使其可以表示從 128 到 255 的十進(jìn)制值。那么沖突就發(fā)生了。例如,越南人使用十進(jìn)制值 182 來表示越南字母 ?,而印度人使用相同的值 182 來表示印地語字母?。因此,如果印度人寫的電子郵件包含字母?并且它被越南人閱讀,那么將會顯示為?。顯然這不是預(yù)期的效果。
那么如何解決這個(gè)問題呢,接下來就該 Unicode 出場了。
Unicode 和代碼點(diǎn)Unicode 字符集將世界上的每個(gè)字符都映射到一個(gè)唯一的數(shù)字上。這確保了不同語言的字母之間沒有沖突。這些數(shù)字與平臺無關(guān)。
這些唯一的數(shù)字在 unicode 術(shù)語中稱為代碼點(diǎn)。
讓我們看看它們是如何被引用的。
使用代碼點(diǎn)引用 拉丁字符?
U+1E4DU+ 表示 unicode,1E4D是分配給字符 ? 的十六進(jìn)制值。
英文字母A表示為 U+0041
好了,了解了這些,接下來該是重頭戲了
UTF-8 編碼現(xiàn)在我們知道什么是 unicode 以及如何將世界上的每個(gè)字母分配給一個(gè)唯一的代碼點(diǎn),我們需要一種在計(jì)算機(jī)內(nèi)存中表示這些代碼點(diǎn)的方法。這就是字符編碼登場的地方。 其中最為人們所熟知的就是 UTF-8 編碼。
UTF-8 編碼是一種大小可變的編碼方案,用于表示內(nèi)存中的 unicode 代碼點(diǎn)。大小可變編碼意味著代碼點(diǎn)根據(jù)其大小使用 1、2、3 或 4 個(gè)字節(jié)表示。
UTF-8 1 字節(jié)編碼1個(gè)字節(jié)編碼的標(biāo)識是第一個(gè)比特位為0。
UTF8 1字節(jié)編碼表示方式
英文字母A的 unicode 代碼點(diǎn)為 U+0041。它的二進(jìn)制表示是1000001。
A 以 UTF-8 編碼表示為
01000001
紅色的0位表示使用1字節(jié)編碼,其余位代表碼位
UTF-8 2 字節(jié)編碼代碼點(diǎn)為 U+00F1 的拉丁字母?的二進(jìn)制值11110001。該值大于可以使用 1 字節(jié)編碼格式表示的最大值,因此該字母表將使用 UTF-8 2 字節(jié)編碼表示。
2 字節(jié)編碼的方式是由第一個(gè)字節(jié)比特位中的高三位的比特序列110和第二個(gè)字節(jié)比特位中的高二位的比特序列10來標(biāo)識。
UTF8 2字節(jié)編碼方式表示
Unicode 代碼點(diǎn)U+00F1的二進(jìn)制值是1111 0001。用2字節(jié)編碼格式填充這些位,我們得到如下所示的?的UTF-8 2字節(jié)編碼表示。
填充是從映射到第二個(gè)字節(jié)的最低有效位的代碼點(diǎn)的最低有效位開始完成的。
1100001110110001
藍(lán)色的二進(jìn)制數(shù)字11110001代表碼位U+00F1的二進(jìn)制值,紅色的是2字節(jié)編碼標(biāo)識符。黑色零用于填充字節(jié)中的空位。
UTF-8 3 字節(jié)編碼具有代碼點(diǎn)U+1E4D的拉丁字符?使用 3 字節(jié)編碼表示,因?yàn)樗笥谑褂?2 字節(jié)編碼可以表示的最大值。
3 字節(jié)編碼通過第一個(gè)字節(jié)中的位序列1110 和第二個(gè)和第三個(gè)字節(jié)中的 10的存在來標(biāo)識。
UTF8 3字節(jié)編碼表示
? 十六進(jìn)制代碼點(diǎn) 0x1E4D,對應(yīng)的二進(jìn)制值為1111001001101。將這些位填充到上述編碼格式中,我們得到了下面所示的 ? 的UTF-8 3 字節(jié)編碼表示。
填充是從映射到第三個(gè)字節(jié)的最低有效位的代碼點(diǎn)的最低有效位開始進(jìn)行的。
111000011011100110001101
紅色位表示 3 字節(jié)編碼,黑色位是填充位,藍(lán)色位表示代碼點(diǎn)。
UTF-8 4 字節(jié)編碼表情符號的Unicode代碼點(diǎn)U+1F62D。這大于可以使用 3 字節(jié)編碼表示的最大值,因此將使用 4 字節(jié)編碼表示。
4 字節(jié)編碼通過第一個(gè)字節(jié)中的11110和隨后的第二個(gè)、第三個(gè)和第四個(gè)字節(jié)中的10來標(biāo)識。
UTF8 4字節(jié)編碼表示
U+1F62D的二進(jìn)制表示是11111011000101101。將這些位填入上述編碼格式,我們就得到了的UTF-8 4字節(jié)編碼。代碼點(diǎn)的最低有效位映射到第四個(gè)字節(jié)的最低有效位,依此類推。
11110000100111111001100010101101
紅色位標(biāo)識4字節(jié)編碼格式,藍(lán)色位是實(shí)際碼位,黑色位是填充位。
上面我們分別對 UTF-8 的幾種編碼方式進(jìn)行了詳細(xì)的介紹。接下來我們順帶介紹一下 UTF-16 和 UTF-32 編碼方式
UTF-16 編碼UTF-16 編碼是一種可變字節(jié)編碼方案,它使用 2 個(gè)字節(jié)或 4 個(gè)字節(jié)來表示 unicode 代碼點(diǎn)。所有現(xiàn)代語言的大多數(shù)字符都使用 2 個(gè)字節(jié)表示。
拉丁字母?的Unicode代碼點(diǎn)為 U+00F1 二進(jìn)制表示為 11110001 。其 UTF-16 編碼表示為
0000000011110001
上面的表示是在 Big Endian 字節(jié)順序模式下(最高有效位在前)。
UTF-32 編碼UTF-32 編碼是一種固定字節(jié)編碼方案,它使用 4 個(gè)字節(jié)來表示所有代碼點(diǎn)。
英文字母 A 具有 Unicode 代碼點(diǎn) U+0041。它的二進(jìn)制表示是 1000001。
它以UTF-32編碼表示,如下所示,
00000000 00000000 00000000 01000001
藍(lán)色位是代碼點(diǎn)的二進(jìn)制表示。上面的表示是在 Big Endian 字節(jié)順序模式下。
以上就是關(guān)于字符集和字符編碼的所有內(nèi)容。
轉(zhuǎn)載請注明來自夕逆IT,本文標(biāo)題:《ascall碼表(Unicode 字符集和 UTF8UTF16UTF32 編碼)》

還沒有評論,來說兩句吧...