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个八位字节编码UTF-8值(或者甚至是4个不在上述范围内的一些)?
第12节:
将字符范围限制为0000-10FFFF(UTF-16 可访问范围)。
查看之前的RFC确认了这一点......他们缩小了字符范围。
第10节:
编码为UTF-8时会出现另一个安全问题:ISO / IEC 10646 UTF-8的描述允许编码最多的字符数 U + 7FFFFFFF,产生最多6个字节的序列。因此 如果字符数范围不是,则存在缓冲区溢出的风险 显式限制为U + 10FFFF或缓冲区大小不适用 考虑到5字节和6字节序列的可能性。
因此,根据ISO / IEC 10646定义允许这些序列,而不是RFC 3629定义?我应该遵循哪一个?
提前致谢。
答案 0 :(得分:8)
答案 1 :(得分:1)
UTF-8和UTF-16都允许对所有Unicode字符进行编码。 UTF-8不允许做的是编码上下替代半部(UTF-16使用的)或U + 10FFFF以上的值,这些都不是合法的Unicode。
请注意,BMP以U + FFFF结束。
答案 2 :(得分:0)
我不得不说:Unicode代码点对范围[0,0x10FFFF]有效,并且那些映射到1-4个八位字节。因此,如果您确实遇到了一个5或6个八位字节的UTF-8编码代码点,那么它不是一个有效的代码点 - 当然没有任何分配。我有点困惑,为什么他们在ISO标准中存在 - 我找不到解释。
然而,这确实让你想知道,如果将来某一天他们会扩展到U + 10FFFF。 0x10FFFF允许超过一百万个字符,但是有很多字符,它将取决于最终编码的数量。 (为了理智,让我们不希望,一百万个字符很多!)UTF-32可以处理更多代码点,正如您所发现的,UTF-8可以。真的是UTF-16运气不好 - 在代码点的某个地方需要更多的代理对。