6个八位位组的UTF-8序列是否有效?

时间:2010-08-24 17:24:18

标签: unicode utf-8

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定义?我应该遵循哪一个?

提前致谢。

3 个答案:

答案 0 :(得分:8)

除了10FFFF以外没有Unicode个字符,BMP涵盖0000到FFFF。

UTF-8定义为0-10FFFF。

答案 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运气不好 - 在代码点的某个地方需要更多的代理对。