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值(甚至有些UTF-8值的UTF-8值不属于上述范围)?
第12款:
将字符范围限制为0000-10 10FFFF( UTF-16可访问范围)。
查看前面的RFC确认this...they缩小了字符的范围。
第10款:
另一个安全问题是在对UTF-8进行编码时发生的: ISO/IEC 10646对UTF-8的描述允许将字符编号编码到U+7FFFFFFF,产生最多6个字节的序列。因此,如果字符号的范围不明确地限制为U+10FFFF,或者缓冲区大小没有考虑到5字节和6字节序列的可能性,则存在缓冲区溢出的风险。
因此,这些序列是允许的ISO/IEC 10646定义,而不是RFC 3629定义?我该跟着哪一个?
提前谢谢。
发布于 2010-08-24 17:32:07
它们不是超过10FFFF的Unicode字符,BMP通过FFFF覆盖0000。
对于0-10FFFF,UTF-8定义得很好。
发布于 2010-08-24 17:36:12
UTF-8和UTF-16都允许对所有Unicode字符进行编码.不允许UTF-8编码上、下代理项( UTF-16使用的)或高于U+10FFFF的值,这不是合法的Unicode。
注意,BMP以U+FFFF结尾。
发布于 2010-08-31 03:07:39
我不得不说不: Unicode代码点对0,0x10FFFF范围有效,而那些映射到1-4个八位数。所以,如果你遇到了一个5-或6-八位的UTF-8编码编码点,它不是一个有效的代码点--那里肯定没有指定的任何东西。我有点困惑,为什么他们在ISO标准-我找不到一个解释。
然而,这确实让你怀疑,如果将来有一天,他们会扩展过去的U+10FFFF。0x10FFFF允许超过一百万个字符,但是有很多字符,这将取决于最终编码了多少字符。(看在理智的份上,我们希望不是,一百万个字是很多的!)UTF-32可以处理更多的代码点,正如您已经发现的那样,UTF-8可以。这将是真正的UTF-16,这是不走运的-将需要更多的代孕对将需要在某个地方的代码点。
https://stackoverflow.com/questions/3559161
复制相似问题