Unicode代码点限制

时间:2011-02-13 08:26:29

标签: unicode character-encoding

正如here所解释的那样,所有unicode编码都以最大代码点结束10FFFF但我听到的不同之处是 它们可以达到6个字节,是真的吗?

4 个答案:

答案 0 :(得分:7)

UTF-8在其生命周期中经历了一些变化,并且有许多规范(现在大部分已经过时)标准化了UTF-8。引入的大多数更改是为了帮助兼容UTF-16并允许不断增长的代码点。

简而言之,UTF-8最初被指定为允许最多31位(或6字节)的代码点。但是使用RFC3629,最多减少到4个字节。与UTF-16更兼容。

维基百科还有一些informationUniversal Character Set的规范与Unicode及其转换格式(UTF)的历史密切相关。

答案 1 :(得分:3)

最大的unicode代码点和使用的unicode字符的编码是两件事。根据标准,最高代码点实际上是0x10ffff,但是因此你只需要21位就可以轻松容纳4个字节,即使浪费了11位!

我想你的问题大概有6个字节,你的意思是一个6字节的utf-8序列,对吧?正如其他人已经回答的那样,使用utf-8机制你可以真正处理6字节序列,你甚至可以处理7字节序列甚至是8字节序列。 7字节序列为您提供以下字节必须提供的范围,6 x 6位= 36位,8字节序列为您提供7 x 6位= 42位。您可以处理它,但不允许这样做,因为不需要,最高代码点是0x10ffff。

如Hibou57所述,禁止使用比所需更长的序列。使用utf-8必须始终使用最短的序列,否则序列将被视为无效!当然,ASCII字符必须是7位单字节。第二件事是utf-8 4字节序列在初始字节中提供3位有效载荷,在后续字节中提供18位有效载荷,这些字节为21位,与使用utf-16编码时的代理计算相匹配。从码点中减去偏差0x10000,剩余的20位到达高位和低代理有效载荷区域,每个10位。第三个也是最后一个是,在utf-8中,不允许编码hi-或-lo-surrogate值。代理不是字符而是容器,代理只能出现在utf-16中,而不能出现在utf-8或utf-32编码文件中。

答案 2 :(得分:2)

查看Do UTF-8,UTF-16, and UTF-32 Unicode encodings differ in the number of characters they can store?

的答案 理论上,UTF-8和UTF-32能够代表U + 10FFFF以上的字符,但人为限制以匹配UTF-16的容量。

答案 3 :(得分:1)

实际上,对于UTF-8编码的一些观点,UTF-8在技术上可以允许编码超出永久固定有效范围上限的码点;所以可以编码超出该范围的代码点,但它不会是任何地方的有效代码点。另一方面,您可以使用不需要的归零高位来编码一个字符,例如。编码具有多个位的ASCII码点,如2#1100_0001#, 2#1000_0001#(使用Ada符号),这将用于以两个字节编码的ASCII字母A UTF-8。但是,它可能被某些安全/安全过滤器拒绝,此用途用于黑客攻击和盗版。 RFC 3629对此有一些解释。人们应该坚持编码有效的代码点(由Unicode定义),安全的方式(没有多余的字节)。