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

标签 unicode encoding utf-8

关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。












想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。

7年前关闭。




Improve this question




我需要帮助理解“0-127 中的每个代码点都存储在一个字节中”,如下文所引用。

这是上下文:

Thus was invented the brilliant concept of UTF-8. UTF-8 was another system for storing your string of Unicode code points, those magic U+ numbers, in memory using 8 bit bytes. In UTF-8, every code point from 0-127 is stored in a single byte. Only code points 128 and above are stored using 2, 3, in fact, up to 6 bytes.



来源: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 个字节?

最佳答案

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

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 经过精心设计,非常棒。试着找到一些关于它的背景信息,以了解它的所有美丽。

    关于unicode - UTF-8:如何仅将 0-127 存储到单个字节中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26070766/

    相关文章:

    perl - 如何将 Unicode 代码点 (\uXXXX) 转换为 Perl 中的字符?

    c++ - VS2010 中的字符集

    python - 如何更改文件中的字节?

    高于 U+FFFF 的字符的 Javascript 文字

    java - 我如何在 Quarkus 中定义用于序列化的聊天集?

    python - 使用 BeautifulSoup4 和 Python 3.3 解析错误

    php - 如何确保我的所有内容都是 UTF-8 并解决编码问题?

    java - C++ 和 Java 编码

    php - MySql、Php 未设置为 UTF8

    php - 从 MySQL 读取 UTF-8 数据显示 ?而不是我