Unicode代码点限制

Unicode代码点限制,unicode,character-encoding,Unicode,Character Encoding,如前所述,所有unicode编码都以最大代码点10FFFF结束,但我听到的不同 它们最多可以达到6个字节,是真的吗?UTF-8在其生命周期中经历了一些变化,并且有许多规范(其中大多数现在已经过时)将UTF-8标准化。大多数更改都是为了帮助与UTF-16兼容,并允许不断增加的代码点数量 长话短说,UTF-8最初被指定为允许最多31位(或6字节)的代码点。但是,为了与UTF-16更兼容,这被减少到最多4个字节 维基百科还有更多。的规范与Unicode及其转换格式(UTF)的历史密切相关。请参见 UT

如前所述,所有unicode编码都以最大代码点
10FFFF
结束,但我听到的不同
它们最多可以达到6个字节,是真的吗?

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

长话短说,UTF-8最初被指定为允许最多31位(或6字节)的代码点。但是,为了与UTF-16更兼容,这被减少到最多4个字节

维基百科还有更多。的规范与Unicode及其转换格式(UTF)的历史密切相关。

请参见


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

事实上,对于UTF-8编码的某些观点,UTF-8在技术上允许编码超出永久固定的有效范围上限的码点;因此,可以对超出该范围的代码点进行编码,但它在任何地方都不是有效的代码点。另一方面,您可以使用不需要的零高阶位对字符进行编码,例如,使用多个位对ASCII码点进行编码,如
2#1100#u 0001#,2#1000#u 0001#
(使用Ada表示法),这将用于使用两个字节编码的ASCII字母
a
UTF-8。但是,它可能会被一些安全/保安过滤器拒绝,在这种情况下被用于黑客和盗版。RFC3629对此有一些解释。我们应该坚持编码有效的代码点(由Unicode定义),安全的方式(没有多余的字节)。

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

我猜关于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代理值进行编码。代理项不是字符而是它们的容器,代理项只能出现在utf-16中,而不能出现在utf-8或utf-32编码的文件中

@Ted:正如我所说,这完全取决于你声称UTF-8是什么,有不同的(部分过时的)标准。最新的是RFC3692。还要注意,UTF不是UCS。UTF-8只是为UCS(因此ISO 10646-1)中定义的字符定义了一个编码标准@Holger:“最新的是RFC 3692”->RFC 3629,而不是3692(你的第一篇帖子是对的)。@Hibou57:It。。。嗯。。。这是一个测试:)你当然是对的。utf-8机制允许最多8字节的序列。一个7字节的序列已经没有一个位了,因为startbyte中的有效负载nore将有8字节的序列startbyte中的任何有效负载位。但7字节序列会导致以下字节的6 x 6=36个有效负载位,8字节序列甚至会导致以下字节的7 x 6=42位。但由于0x10ffff unicode码点限制,允许使用utf-8的最大4字节序列。对。然而,utf-8和utf-32的限制不仅是最高码点的限制,还包括不编码代理,以及utf-8始终使用尽可能最短的序列。