【问题标题】:Why is the character é encoded as 0xC3 0xA9 in UTF-8?为什么字符 é 在 UTF-8 中编码为 0xC3 0xA9?
【发布时间】:2012-05-04 11:06:40
【问题描述】:

如果我将字符 é 写入文件并使用十六进制编辑器打开它,我可以看到字节 0xC3、0xA9。

在维基百科中,第一个字节称为前导字节,第二个字节称为尾随字节。 0xC3 它是一个元数据字节,这意味着它用 1 个字节编码的字符 0xA9,但 é 的 unicode 值是 0xE9

我基本上想知道为什么é 它被编码为 0xA9 而不是 0xE9。文本编辑器如何从 0xC3A9 转换为 0xE9?有移位操作吗?

【问题讨论】:

    标签: unicode encoding utf-8


    【解决方案1】:

    是什么让你认为 0xC3 是“元数据字节”?

    UTF-8 中的每个字节都包含有关已编码代码点的相关信息。

    UTF-8 编码代码点的第一个字节包含一个标记(前导 1 的数量),指示用于编码代码点的总字节数(*) 实际代码点的前几位。然后所有尾随字节包含一个“继续标记”(位 10)和编码代码点的另外 6 个位。

    关于 UTF-8 的 Wikipedia 文章有 a pretty good description of the process

    有一种直接使用代码点值的编码:UTF-32 (a.k.a UCS-4),基本上是“将代码点值用作 32 位值”

    (*) 标记实际上非常简单:如果字节以0 开头(即最高有效位是)0,则它是单字节编码(即 0 之间的代码点和 127)。如果它以10 开头,那么它是一个延续字节。如果它是 110111011110,那么它分别是 2、3 或 4 字节序列的开始。 1111101111110 也曾经被定义过,但在现代 UTF-8 中不再有效(因为它们只需要对保证在 Unicode 标准中永远不会使用的值进行编码)。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-27
    • 1970-01-01
    • 2021-12-17
    • 2020-02-17
    • 2019-09-30
    • 2011-08-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多