Unicode字符集和UTF-8,UTF-16,UTF-32編碼
ASCII
在以前的計算機時代,ASCII碼是用來代表字符。英語只有26個字母和少許的特殊字符和符號。
下面的表格提供了ASCII字符和它們對應的十進制、十六進制的值。
你就可以推斷上面的表格,ASCII碼的值可以代表0-127的十進制數字系統,我們看一下用8bit表示0-127的二進制表示。
0表示為
00000000
127表示為
0111111
根據上面的二進制表示,我們可以推斷十進制數0-127可以用7個比特位表示,第八個比特位可以忽略。
那么事情就開始混亂了。
人們開始對剩下的第八個比特位提出了不同的用法,可以用它來代表十進制數128-255,然后,沖突就出現了。例如,越南人用十進制數128表示越南字母ờ,然而,印度人用十進制數128來表示印度語字母घ。所以,如果一個印度人寫了一封包含字母घ的郵件,那么越南人看到了會把它顯示為越南字母ờ。顯然這不是預期的顯示方式。
Unicode字符串的到來,拯救了這次危急。
Unicode 和 Code Points
Unicode字符集映射到世界上的每一個字符的數字都是唯一的。這確保了不同語言的字符不會再有沖突,這些數字與平台無關。
這些唯一的數字在unicode的術語中稱為code points
讓我們看下它們是如何被引用的。
拉丁字符ṍ是引用了下面的code point
U+1E4D
U+表示是unicode,1E4D是用來表示字符ṍ的十六進制值。
英語字母A是用U+0041來表示。
有興趣可以訪問http://www.unicode.org/charts/ 來查看世界上所有語言字母的code points。
UTF-8 Encoding
現在我們已經知道了什么是 unicode,還有世界上的每一個字母都分配了一個唯一的code point。我們需要一種方式如何在電腦內存中表示這些code point。這時候,字符編碼就出現了。其中就有這么一種編碼方案UTF-8.
UTF-8是一種可在電腦內存中表示unicode code point的可變大小的編碼方案,可變大小編碼意味着會根據code point的大小而用1,2,3,4個字節來表示。
UTF-8 1個字節編碼
一個字節編碼默認出現的第一個字節為0
英語字母A的unicode code point是U+0041,它的二進制表示是1000001
A用UTF-8編碼來表示就是 01000001
上面紅色的零個比特位表示使用的是1個字節編碼,剩下的比特位就表示code point
UTF-8 2個字節編碼
拉丁文ñ的code point是U+00F1,它的二進制值是11110001,這個值比一個字節編碼所能表示的最大值還要大,因此這個字母需要用UTF-8的2個字節編碼。
2個字節編碼的標識是第一個字節的比特位序列是110,第二個字節的序列是10。
unicode code point U+00F1的二進制值為1111 0001,在兩個字節編碼格式中填充這些比特位,如下我們就得到了表示ñ的UTF-8 2個字節編碼。數據填充是從右邊的最低有效位開始映射到第二個字節的最低有效位。
藍色的二進制數字11110001表示code point U+00F1的二進制值,而紅色的部分則是2個字節編碼的標識符。黑色部分的0則是用來填充字節中空白的比特位。
UTF-8 3個字節編碼
拉丁字符ṍ 的code point是U+1E4D,要用3個字節編碼來表示,因為它超過了兩個字節編碼所能表示的最大值。
一個3個字節編碼的標識符按順序是1110在第一個字節,10在第二、第三個字節
十六進制0x1E4D的二進制值是1111001001101,把這些比特值按照上面給到的編碼格式來填充,下面展示的就是表示ṍ的UTF-8 3個字節編碼。它的填充方式就是從最低有效位開始一直到第三個字節的最低有效位。
紅色的比特位表示的是3個字節編碼,黑色部分是填充部分,藍色部分表示code point。
UTF-8 4個字節編碼
Emoji😭的unicode code point是U+1F62D,大於3個字節編碼所能表示的最大的值,因此我們要是用4個字節編碼來表示。
4個字節編碼的標識是第一個字節以11110開頭,隨后的第二、第三、第四字節是以10開頭。
U+1F62D的二進制表示是11111011000101101,用這些比特數字填充上面提供給我們的UTF-8 4個字節編碼的編碼格式。一直從code point的左邊的最低有效位一直映射到第四個字節的有效位。
上面紅色的比特位表示是4個字節編碼,藍色部分是實際的code point,黑色部分則是填充位。
UTF-16 編碼
UTF-16是一個可變字節編碼方案,它使用2個或4個字節來表示unicode code point。所有現代語言的大部分字符都是用2個字節來表示。
拉丁字母ñ的code point是U+00F1,它的二進制值是11110001,用UTF-16編碼來表示如下:
上面的表示用的是大端字節順序(最高有效位在先)
UTF-32 編碼
UTF-32是一個固定字節的編碼方案,它用4個字節來表示所有的code point。
英語字母A的unicode code point是U+0041,它的二進制表示位1000001.
它的UTF-32編碼表示如下:
藍色的比特位是code point的二進制表示,上面假設的是大端字節順序模式。
以上就是字符集和編碼的內容。
感謝閱讀,
原本地址: https://naveenr.net/unicode-character-set-and-utf-8-utf-16-utf-32-encoding/