UTF-8:如何仅将0-127存储到一个字节中?

想象者

我需要帮助来理解下面引述的“ 0-127中的每个代码点都存储在一个字节中”。

这里是上下文:

因此发明了UTF-8的出色概念。UTF-8是另一个使用8位字节将Unicode代码点的字符串(那些神奇的U +数字)存储在内存中的系统。在UTF-8中,从0-127的每个代码点都存储在一个字节中。实际上,只有代码点128和更高的代码点使用2、3存储,最多6个字节。

来源:http : //www.joelonsoftware.com/articles/Unicode.html

我知道数字0-127是用来表示ASCII字符的数字。Unicode字符由U + HexHex(又称代码点)表示。0-127如何转换为代码点?如果每个十六进制数字可以表示16个选项,则一个8位字节可以容纳2个十六进制数字(2 ^ 8 = 16 * 16 = 256)。

问题:但是可以表示256个字符,那么为什么要停止在127个字符呢?我可以看到为什么256个代码点以上的字符需要2个字节,但是为什么128-256个代码点需要2个字节?

罗兰·伊利格(Roland Illig)

打个比方,假设您想在多个页面上写一个长文本,并且需要确切地知道文本何时结束。然后,您可能会在右下角保留一小部分用于说明“文本在下一页继续”或“文本在此处结束”的注释。例子:

page 1: This is a very [the text continues on the next page]
page 2: long text that [the text continues on the next page]
page 3: does not fit   [the text continues on the next page]
page 4: on one page.   [the text ends here]

很明显,页面的右下角不能用于普通文本,因为继续标记已经使用了它。

当将字节序列转换为代码点序列时,UTF-8使用了一种非常相似的技术。规则是:

  • 如果序列的第一个字节在0到127之间,则其值为代码点。
  • 如果序列的第一个字节在128到191之间,则为错误。
  • 如果序列的第一个字节在192和255之间,则它属于几个字节的序列,这些字节的某些位用于计算代码点。以下字节必须在128和191之间。

这意味着每个字节的最高位用作标记,表明“此字节是多字节代码点序列的一部分”。由于此位具有此含义,不能具有任何其他含义,因此只能使用一个字节表示从0到127的代码点。所有其他代码点都需要一个以上的字节。


UTF-8不是唯一以字节顺序存储Unicode代码点的可能性。您还可以使用以下规则定义编码:

  • 如果第一个字节在0到253之间,则表示其代码点。
  • 如果第一个字节为254,则后面的两个字节用于254至65535范围内的代码点。
  • 如果第一个字节为255,则后面的三个字节用于U + 010000到U + 10FFFF范围内的代码点。

现在,对于0到253的代码点,您只需要一个字节,而对于所有其他代码点,则至少需要三个字节,这对于希腊语,西里尔字母,东亚语言和许多其他语言都是浪费的。

UTF-8经过精心设计,非常棒。尝试查找有关它的一些背景信息,以了解其所有优点。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

UTF-8:如何仅将0-127存储到一个字节中?

来自分类Dev

如何存储一个字节片?

来自分类Dev

将4个不同的值存储在一个字节中

来自分类Dev

尝试将图像存储到sqlite中,当我尝试检索图像时,它是一个字节而不是200万字节

来自分类Dev

如何在协议缓冲区中存储一个字节?

来自分类Dev

一个字节的变量如何存储两个字节的字符常量?

来自分类Dev

如果首字母或最后一个字母在utf8中,则preg_match_all失败

来自分类Dev

SQLite 3 UTF-8无法在PHP mojibake中获得第一个字符

来自分类Dev

如何将一个字符串数组存储到另一个字符串数组中?

来自分类Dev

如何在C ++中删除UTF-8字符串的最后一个字符?

来自分类Dev

将字节从字节数组复制到C#中另一个字节数组的特定位置

来自分类Dev

将字节从字节数组复制到C#中另一个字节数组的特定位置

来自分类Dev

短存储4个0-16数字(或在一个字节中存储2个数字)

来自分类Dev

如何从Python的字节列表中获取最后一个字节项?

来自分类Dev

在ruby中,如何将一个字节的文本表示转换为一个字节?

来自分类Dev

21个字节的UTF-8序列如何仅由5个字符组成?

来自分类Dev

如何将UTF-8格式的字符串(不是bytes [])解码为Java中的另一个字符串?

来自分类Dev

将字节数组复制到C#中的另一个字节数组

来自分类Dev

UTF8 编码如何支持内存中 1 到 4 个字节的范围?

来自分类Dev

另一个字符串转换URL utf8 java

来自分类Dev

如何在一个字节数组中连续查找一个字节数组?

来自分类Dev

在SD卡扇区中仅更改一个字节

来自分类Dev

将指针移动一个字节

来自分类Dev

255(FF)个字节后,如何从DIMM中读取一个字节的串行存在检测(SPD)数据?

来自分类Dev

C++11,仅将一个字段复制到向量中

来自分类Dev

-128如何适合一个字节

来自分类Dev

如何创建一个字节文件?

来自分类Dev

C-将一个字节的las三位与一个字节合并

来自分类Dev

将字符串的长度和值保存到一个字节中

Related 相关文章

  1. 1

    UTF-8:如何仅将0-127存储到一个字节中?

  2. 2

    如何存储一个字节片?

  3. 3

    将4个不同的值存储在一个字节中

  4. 4

    尝试将图像存储到sqlite中,当我尝试检索图像时,它是一个字节而不是200万字节

  5. 5

    如何在协议缓冲区中存储一个字节?

  6. 6

    一个字节的变量如何存储两个字节的字符常量?

  7. 7

    如果首字母或最后一个字母在utf8中,则preg_match_all失败

  8. 8

    SQLite 3 UTF-8无法在PHP mojibake中获得第一个字符

  9. 9

    如何将一个字符串数组存储到另一个字符串数组中?

  10. 10

    如何在C ++中删除UTF-8字符串的最后一个字符?

  11. 11

    将字节从字节数组复制到C#中另一个字节数组的特定位置

  12. 12

    将字节从字节数组复制到C#中另一个字节数组的特定位置

  13. 13

    短存储4个0-16数字(或在一个字节中存储2个数字)

  14. 14

    如何从Python的字节列表中获取最后一个字节项?

  15. 15

    在ruby中,如何将一个字节的文本表示转换为一个字节?

  16. 16

    21个字节的UTF-8序列如何仅由5个字符组成?

  17. 17

    如何将UTF-8格式的字符串(不是bytes [])解码为Java中的另一个字符串?

  18. 18

    将字节数组复制到C#中的另一个字节数组

  19. 19

    UTF8 编码如何支持内存中 1 到 4 个字节的范围?

  20. 20

    另一个字符串转换URL utf8 java

  21. 21

    如何在一个字节数组中连续查找一个字节数组?

  22. 22

    在SD卡扇区中仅更改一个字节

  23. 23

    将指针移动一个字节

  24. 24

    255(FF)个字节后,如何从DIMM中读取一个字节的串行存在检测(SPD)数据?

  25. 25

    C++11,仅将一个字段复制到向量中

  26. 26

    -128如何适合一个字节

  27. 27

    如何创建一个字节文件?

  28. 28

    C-将一个字节的las三位与一个字节合并

  29. 29

    将字符串的长度和值保存到一个字节中

热门标签

归档