【问题标题】:Why is there no Unicode starting with 0xC1?为什么没有以 0xC1 开头的 Unicode?
【发布时间】:2020-01-05 14:09:33
【问题描述】:

在研究 Unicode 和 utf-8 编码时,

我注意到 utf-8 编码的第 129 个 Unicode 以 0xc2 开头。

我检查了 0xcf 的最后一个字母。

没有 Unicode 被 0xc1 编码为 0xc1。

为什么第 129 个 unicode 从 0xc2 而不是 0xc1 开始?

【问题讨论】:

  • 你的问题不清楚。 Unicode 代码点 128 和 129 是 C0 和 `C1` 字符集中的有效字符;没有遗漏。我也不确定 UTF-8 与您的问题有什么关系。
  • 虽然链接的副本解决了 0xC0 的使用问题,而您询问的是 0xC1,但两者的解释是相同的。有关详细信息,请参阅en.wikipedia.org/wiki/UTF-8#Codepage_layout
  • 链接的重复是一个不同的问题,具有相似的答案,所以我认为这不应该作为重复的问题关闭。

标签: unicode encoding utf-8


【解决方案1】:

UTF-8 规范,RFC 3629introduction 中特别声明:

八位字节值 C0、C1、F5 到 FF 永远不会出现。

这是因为一个 1 字节的 UTF-8 序列由 8 位二进制模式 0xxxxxxx(一个 0 后跟 7 位)组成,并且可以表示适合 7 位的 Unicode 代码点(U+ 0000 到 U+007F)。

一个 2 字节的 UTF-8 序列由 16 位二进制模式 110xxxxx 10xxxxxx 组成,可以表示适合 8 到 11 位(U+0080 到 U+07FF)的 Unicode 代码点。

在 UTF-8 编码中使用比最低要求更多的字节是不合法的,因此虽然 U+007F 可以用两个字节表示为 <b>110</b>00001 <b>10</b>111111C1 BF 十六进制),但它更紧​​凑,因此遵循规范作为 1 字节的<b>0</b>1111111

第一个有效的两字节值是U+0080的编码,即<b>110</b>0010 <b>10</b>000000C2 80十六进制),所以C0C1永远不会出现。

请参阅标准中的第 3 节 UTF-8 definition。最后一段说:

上述解码算法的实现必须防止 解码无效序列。例如,一个简单的实现可能 将超长的 UTF-8 序列 C0 80 解码为字符 U+0000....

【讨论】:

    【解决方案2】:

    以 0xc1 开头的 UTF-8 将是 0x40 到 0x7f 范围内的 Unicode 代码点。 0xc0 将是 0x00 到 0x3f 范围内的 Unicode 代码点。

    有一条铁律,即每个代码点都以尽可能最短的方式以 UTF-8 表示。由于所有这些代码点都可以存储在单个 UTF-8 字节中,因此它们不允许使用两个字节来存储。

    出于同样的原因,您会发现没有以 0xf0 0x80 到 0xf0 0x8f 开头的 4 字节代码,因为它们使用更少的字节存储。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 2011-01-29
      • 2011-09-06
      • 1970-01-01
      • 2013-02-24
      • 2020-04-25
      相关资源
      最近更新 更多