美文网首页
五分钟让你彻底了解Unicode/UTF-8/UTF-16/UT

五分钟让你彻底了解Unicode/UTF-8/UTF-16/UT

作者: _Cappuccino_ | 来源:发表于2022-04-12 23:21 被阅读0次

    声明

    本文原文是英文,搬运自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 编码表示,如下所示,

    蓝色位是代码点的二进制表示。以上假设大端字节顺序模式。

    相关文章

      网友评论

          本文标题:五分钟让你彻底了解Unicode/UTF-8/UTF-16/UT

          本文链接:https://www.haomeiwen.com/subject/eelosrtx.html