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/