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

Pat*_*ski 7 unicode utf-8

UTF-8可以编码5或6字节序列,允许编码所有Unicode字符吗?我的标准越来越矛盾了.我需要能够支持每个Unicode字符,而不仅仅是那些U + 0000..U + 10FFFF范围内的字符.

(所有引用均来自RFC 3629)

第3节:

在UTF-8中,使用1到4个八位字节的序列对来自U + 0000..U + 10FFFF范围(UTF-16可访问范围)的字符进行编码.一个"序列"的唯一八位字节将高阶位设置为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时会出现另一个安全问题:UTF-8的ISO/IEC 10646描述允许编码高达U + 7FFFFFFF的字符数,产生最多6个字节的序列.因此,如果字符数范围没有明确限制为U + 10FFFF,或者缓冲区大小没有考虑到5字节和6字节序列的可能性,则存在缓冲区溢出的风险.

那么这些序列是否符合ISO/IEC 10646定义,而不是RFC 3629定义?我应该遵循哪一个?

提前致谢.

dev*_*vio 8

没有超过10FFFF的Unicode字符,BMP涵盖0000到FFFF.

UTF-8定义为0-10FFFF.

  • 谢谢,这是有道理的.这是否意味着我只需要担心超过4个八位字节的UTF-8序列,还有更长的错误? (2认同)