在較早的計算時代,ASCII 代碼用于表示字符。英語隻有 26 個字母和一些其他特殊字符和符号。
下表是 ASCII 碼對照表,包含字符及其相應的十進制和十六進制值。
ASCII 碼對照表
從上表可以推斷出,ASCII 值可以在十進制數系統中表示為 0 到 127。讓我們看看 0 和 127 在 8 位字節中的二進制表示。
0 表示為
0 的二進制表示
127表示為
127 二進制表示
從上面的二進制表示可以推斷,十進制值 0 到 127 可以使用 7 位來表示,而第 8 位是空閑的。
警告 從這個地方起,混亂開始了。
人們想出了不同的方法來使用剩餘的第八位,從而使其可以表示從 128 到 255 的十進制值。那麼沖突就發生了。例如,越南人使用十進制值 182 來表示越南字母 ờ,而印度人使用相同的值 182 來表示印地語字母घ。因此,如果印度人寫的電子郵件包含字母घ并且它被越南人閱讀,那麼将會顯示為ờ。顯然這不是預期的效果。
那麼如何解決這個問題呢,接下來就該 unicode 出場了。
Unicode 和代碼點
Unicode 字符集将世界上的每個字符都映射到一個唯一的數字上。這确保了不同語言的字母之間沒有沖突。這些數字與平台無關。
這些唯一的數字在 unicode 術語中稱為代碼點。
讓我們看看它們是如何被引用的。
使用代碼點引用 拉丁字符ṍ
U 1E4D
U 表示 unicode,1E4D是分配給字符 ṍ 的十六進制值。
英文字母A表示為 U 0041
好了,了解了這些,接下來該是重頭戲了
UTF-8 編碼現在我們知道什麼是 unicode 以及如何将世界上的每個字母分配給一個唯一的代碼點,我們需要一種在計算機内存中表示這些代碼點的方法。這就是字符編碼登場的地方。 其中最為人們所熟知的就是 UTF-8 編碼。
UTF-8 編碼是一種大小可變的編碼方案,用于表示内存中的 unicode 代碼點。大小可變編碼意味着代碼點根據其大小使用 1、2、3 或 4 個字節表示。
UTF-8 1 字節編碼1個字節編碼的标識是第一個比特位為0。
UTF8 1字節編碼表示方式
英文字母A的 unicode 代碼點為 U 0041。它的二進制表示是1000001。
A 以 UTF-8 編碼表示為
01000001
紅色的0位表示使用1字節編碼,其餘位代表碼位
UTF-8 2 字節編碼代碼點為 U 00F1 的拉丁字母ñ的二進制值11110001。該值大于可以使用 1 字節編碼格式表示的最大值,因此該字母表将使用 UTF-8 2 字節編碼表示。
2 字節編碼的方式是由第一個字節比特位中的高三位的比特序列110和第二個字節比特位中的高二位的比特序列10來标識。
UTF8 2字節編碼方式表示
Unicode 代碼點U 00F1的二進制值是1111 0001。用2字節編碼格式填充這些位,我們得到如下所示的ñ的UTF-8 2字節編碼表示。
填充是從映射到第二個字節的最低有效位的代碼點的最低有效位開始完成的。
1100001110110001
藍色的二進制數字11110001代表碼位U 00F1的二進制值,紅色的是2字節編碼标識符。黑色零用于填充字節中的空位。
UTF-8 3 字節編碼具有代碼點U 1E4D的拉丁字符ṍ使用 3 字節編碼表示,因為它大于使用 2 字節編碼可以表示的最大值。
3 字節編碼通過第一個字節中的位序列1110 和第二個和第三個字節中的 10的存在來标識。
UTF8 3字節編碼表示
ṍ 十六進制代碼點 0x1E4D,對應的二進制值為1111001001101。将這些位填充到上述編碼格式中,我們得到了下面所示的 ṍ 的UTF-8 3 字節編碼表示。
填充是從映射到第三個字節的最低有效位的代碼點的最低有效位開始進行的。
111000011011100110001101
紅色位表示 3 字節編碼,黑色位是填充位,藍色位表示代碼點。
UTF-8 4 字節編碼表情符号的Unicode代碼點U 1F62D。這大于可以使用 3 字節編碼表示的最大值,因此将使用 4 字節編碼表示。
4 字節編碼通過第一個字節中的11110和随後的第二個、第三個和第四個字節中的10來标識。
UTF8 4字節編碼表示
U 1F62D的二進制表示是11111011000101101。将這些位填入上述編碼格式,我們就得到了的UTF-8 4字節編碼。代碼點的最低有效位映射到第四個字節的最低有效位,依此類推。
11110000100111111001100010101101
紅色位标識4字節編碼格式,藍色位是實際碼位,黑色位是填充位。
上面我們分别對 UTF-8 的幾種編碼方式進行了詳細的介紹。接下來我們順帶介紹一下 UTF-16 和 UTF-32 編碼方式
UTF-16 編碼UTF-16 編碼是一種可變字節編碼方案,它使用 2 個字節或 4 個字節來表示 unicode 代碼點。所有現代語言的大多數字符都使用 2 個字節表示。
拉丁字母ñ的Unicode代碼點為 U 00F1 二進制表示為 11110001 。其 UTF-16 編碼表示為
0000000011110001
上面的表示是在 Big Endian 字節順序模式下(最高有效位在前)。
UTF-32 編碼UTF-32 編碼是一種固定字節編碼方案,它使用 4 個字節來表示所有代碼點。
英文字母 A 具有 Unicode 代碼點 U 0041。它的二進制表示是 1000001。
它以UTF-32編碼表示,如下所示,
00000000 00000000 00000000 01000001
藍色位是代碼點的二進制表示。上面的表示是在 Big Endian 字節順序模式下。
以上就是關于字符集和字符編碼的所有内容。
,