【问题标题】:Why UTF-8 encoding doesn't need a Byte Order Mark?为什么 UTF-8 编码不需要字节顺序标记?
【发布时间】:2020-08-17 00:07:25
【问题描述】:

Unicode FAQ 提到 UTF-8 不需要 BOM。

问:UTF-8 编码方案是否相同,无论是否 底层处理器是小端还是大端?

答:是的。由于 UTF-8 被解释为字节序列,因此没有 字节序问题,因为对于使用 16 位或 32 位代码单元。当 BOM 与 UTF-8 一起使用时,它仅用作 将 UTF-8 与其他编码区分开来的编码签名——它 与字节顺序无关。

对于U+0744 以上的代码点,UTF-8 需要 2 到 4 个字节来表示它们。不需要BOM来指定这些字节的字节顺序还是UTF-8采用默认?

【问题讨论】:

    标签: encoding utf-8


    【解决方案1】:

    UTF-8 使用 1 字节的代码单元,因此不需要 BOM 来指示字节顺序,因为只有 1 个字节顺序是可能的,并且编码算法决定了字节的顺序。例如,U+0744 以 UTF-8 编码为代码单元 0xDD 0x84,以字节表示为 DD 84。 Bytes 84 DD 将是非法的 UTF-8 序列。

    与 UTF-16 和 UTF-32 不同,它们分别使用 2 字节和 4 字节代码单元。编码算法决定了代码单元的顺序,但由于代码单元本身是多字节的,所以它们服从字节序。例如,U+0744 在 UTF-16 中编码为代码单元 0x0744,在 UTF-32 中编码为代码单元 0x00000744,在 UTF-16 中以字节表示为 07 4444 07,以及在 UTF-32 中为 07 44 00 0000 00 44 07,具体取决于字节序。

    因此,BOM 可以指示实际用于 UTF-16/32 而不是 UTF-8 的字节序。

    【讨论】:

    • 这一切都说得通,但请注意,Unicode 标准,版本 5.0 声明 BOM 允许用于 UTF-8。请参阅table 2.4 in section 2.6 Encoding Schemes 和后续段落,了解可能使用它的特殊情况。
    • @skomisa 是的,允许在 UTF-8 中使用 BOM,但出于兼容性原因,在大多数情况下通常不鼓励。而且它肯定不用于字节序目的(这个问题的重点),仅用于识别目的以将其与其他 UTF 区分开来。
    【解决方案2】:

    UTF-8 对编码字符的字节顺序给出了严格的定义。不允许计算平台之间的变化。

    例如,欧元符号 U+20AC 必须编码为字节序列\xE2\x82\xAC。不允许对这些字节进行其他排序。

    【讨论】:

      猜你喜欢
      • 2016-12-20
      • 2011-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-30
      • 2019-03-31
      相关资源
      最近更新 更多