【发布时间】:2011-04-03 07:35:29
【问题描述】:
UTF-8 能否编码 5 或 6 字节序列,允许编码所有 Unicode 字符?我得到了相互矛盾的标准。我需要能够支持每个 Unicode 字符,而不仅仅是 U+0000..U+10FFFF 范围内的那些。
(所有引用均来自RFC 3629)
第 3 节:
在 UTF-8 中,U+0000..U+10FFFF 范围内的字符(UTF-16 可访问范围)使用 1 到 4 个八位字节的序列进行编码。这 只有一个“序列”的八位字节将高位设置为 0, 其余 7 位用于对字符编号进行编码。在一个 n 个八位字节的序列,n>1,初始八位位组有 n 个高阶 位设置为 1,然后是位设置为 0。其余位 该八位字节包含要成为的字符数中的位 编码。以下八位字节都将高阶位设置为 1 和后面的位设置为 0,每个保留 6 位包含 要编码的字符中的位。
所以不是所有可能的字符都可以用 UTF-8 编码?这是否意味着我不能对来自不同于 BMP 的平面的字符进行编码?
第 2 节:
八位字节值 C0、C1、F5 到 FF 永远不会出现。
这意味着我们不能用 5 或 6 个八位字节(甚至一些不在上述范围内的 4 个八位字节)编码 UTF-8 值?
第 12 节:
将字符范围限制为 0000-10FFFF(UTF-16 可访问范围)。
查看之前的 RFC 证实了这一点……他们缩小了字符范围。
第 10 节:
编码为 UTF-8 时会出现另一个安全问题:ISO/IEC UTF-8 的 10646 描述允许编码字符数最多 U+7FFFFFFF,产生最多 6 个字节的序列。因此有 如果字符数的范围不是缓冲区溢出的风险 明确限制为 U+10FFFF 或者如果缓冲区大小不考虑 考虑 5 字节和 6 字节序列的可能性。
所以这些序列是根据 ISO/IEC 10646 定义允许的,但不是 RFC 3629 定义?我应该关注哪一个?
提前致谢。
【问题讨论】: