声明
本文原文是英文,搬运自https://naveenr.net/unicode-character-set-and-utf-8-utf-16-utf-32-encoding/,如果网络优秀建立查看原文,本文是参照原文的翻译,如有侵权,请私信我删除,在此感谢作者透彻的讲解,与大家共同学习,共同进步!😄
正文
ASCII
在较早的计算时代,ASCII 码用于表示字符。英语只有 26 个字母和一些其他特殊字符和符号。
下表提供了 ASCII 字符及其对应的十进制和十六进制值。
image.png
从上表可以推断,ASCII 值在十进制数系统中可以表示为 0 到 127。让我们看一下 8 位字节中 0 和 127 的二进制表示。
0 表示为
127 表示为
从上面的二进制表示可以推断,十进制值 0 到 127 可以使用 7 位表示,而第 8 位是空闲的。
这就是事情开始变得混乱的地方。
人们想出了不同的方法来使用剩余的第八位,代表从 128 到 255 的十进制值,并且开始发生冲突。例如,越南人使用十进制值 182 来表示越南字母 ờ,而印度人使用相同的值 182 来表示印地语字母घ。因此,如果由印度人撰写的电子邮件包含字母घ,并且如果由越南人阅读,它将显示为ờ。显然不是预期的出现方式。
这就是Unicode字符集来拯救这一天的地方。
Unicode 和代码点
Unicode 字符集将世界上的每个字符映射到一个唯一的数字。这确保了不同语言的字母之间没有冲突。这些数字与平台无关。
这些唯一的数字在 unicode 术语中称为代码点。
让我们看看它们是如何被引用的。
使用代码点引用 拉丁字符ṍ
U+1E4D
U+表示 unicode,1E4D是分配给字符 ṍ 的十六进制值
英文字母A表示为U+0041
请访问http://www.unicode.org/charts/了解世界上所有语言和字母的代码点
UTF-8 编码
既然我们知道了什么是 unicode 以及世界上的每个字母如何分配给一个唯一的代码点,我们需要一种方法来表示计算机内存中的这些代码点。这就是字符编码出现的地方。一种这样的编码方案是 UTF-8。
UTF-8 编码是一种可变大小的编码方案,用于表示内存中的 unicode 代码点。可变大小编码意味着代码点根据其大小使用 1、2、3 或 4 个字节表示。
UTF-8 1 字节编码
1字节编码由第一位中存在 0 来标识。
英文字母A具有 unicode 代码点U+0041。它的二进制表示是1000001。
A 在 UTF-8 编码中表示为
红色的 0 位表示使用 1 字节编码,其余位表示代码点
UTF-8 2 字节编码
带有代码点U+00F1的拉丁字母ñ具有二进制值11110001。该值大于可以使用 1 字节编码格式表示的最大值,因此该字母表将使用 UTF-8 2 字节编码表示。
2字节编码通过在第一位中存在位序列110和在第二位中存在10来识别。
unicode 代码点U+00F1的二进制值为1111 0001。以 2 字节编码格式填充这些位,我们得到ñ的 UTF-8 2 字节编码表示,如下所示。填充从将代码点的最低有效位映射到第二个字节的最低有效位开始。
蓝色的二进制数字11110001代表代码点 U+00F1 的二进制值,红色的数字是 2 字节的编码标识符。黑色的零用于填充字节中的空位。
UTF-8 3 字节编码
带有代码点U+1E4D的拉丁字符ṍ使用 3 字节编码表示,因为它大于使用 2 字节编码可以表示的最大值。
3字节编码通过在第一个字节中存在位序列1110以及在第二和第三字节中存在10来标识。
十六进制代码点0x1E4D的二进制值为1111001001101。以上述编码格式填充这些位为我们提供了ṍ的 UTF-8 3 字节编码表示,如下所示。填充从映射到第三个字节的最低有效位的代码点的最低有效位开始。
红色位表示 3 字节编码,黑色位是填充位,蓝色位表示代码点。
UTF-8 4 字节编码
Emoji 😭 具有 unicode 代码点U+1F62D。这大于可以使用 3 字节编码表示的最大值,因此将使用 4 字节编码表示。
4 字节编码由第一个字节中的11110 和随后的第二、第三和第四个字节中的10来标识。
U+1F62D的二进制表示是11111011000101101。用上面的编码格式填充这些位给我们 UTF-8 4 字节编码的😭。代码点的最低有效位映射到第四个字节的最低有效位,依此类推。
红色位标识 4 字节编码格式,蓝色位是实际代码点,黑色位是填充位。
UTF-16 编码
UTF-16 编码是一种可变字节编码方案,它使用 2 个字节或 4 个字节来表示 unicode 代码点。所有现代语言的大多数字符都使用 2 个字节表示。
带有代码点U+00F1和二进制值11110001的拉丁字母ñ在 UTF-16 编码中表示为
上面的表示是大端字节顺序模式(最高有效位在前)。
UTF-32 编码
UTF-32 编码是一种固定字节编码方案,它使用 4 个字节来表示所有代码点。
英文字母 A 具有 unicode 代码点 U+0041。它的二进制表示是1000001。
它以 UTF-32 编码表示,如下所示,
蓝色位是代码点的二进制表示。以上假设大端字节顺序模式。
网友评论