单个UTF-8编码字符的最大字节数是多少?
我将加密以UTF-8编码的字符串的字节,因此需要能够计算出UTF-8编码字符串的最大字节数。
请问有人能够确认单个UTF-8编码字符的最大字节数吗?
单个UTF-8编码字符的最大字节数是多少?
我将加密以UTF-8编码的字符串的字节,因此需要能够计算出UTF-8编码字符串的最大字节数。
请问有人能够确认单个UTF-8编码字符的最大字节数吗?
U+10FFFF
:
(原始规范允许超过在UTF-8中,来自U+0000..U+10FFFF范围(UTF-16可访问范围)的字符使用1到4个八位字节序列进行编码。
U+10FFFF
的代码点使用长达6个字节的字符编码。)11111111
,那么有没有什么阻碍我们使用2^(6*7)
个比特空间来表示字符呢? - Aaron Franke没有更多的上下文,我会说UTF-8字符的最大字节数为
答案:6字节
被接受的答案的作者正确指出了这一点作为“原始规范”。 这在RFC-2279 1中是有效的。 如下面的J. Cocoe所指出的那样,这在2003年的RFC-3629 2中发生了变化,将UTF-8限制为编码21位,可以使用编码方案使用四个字节处理。
如果涵盖所有Unicode,则答案为:4字节
但是,在Java <= v7中,他们谈到了使用UTF-8表示Unicode的最大字节数为3个?这是因为原始的Unicode规范仅定义了基本多语言平面(BMP),即它是Unicode的旧版本或现代Unicode的子集。 因此,如果仅表示原始的Unicode,BMP:3个字节
但是,OP谈到的是反过来的情况。不是从字符到UTF-8字节,而是从UTF-8字节到“字符串”字节表示。也许被接受答案的作者从问题的上下文中得出了这个结论,但这并不一定显而易见,可能会让这个问题的普通读者感到困惑。支持标准英文字母编码US-ASCII的最大字节数为1。但随着时间的推移,限制文本只使用英语变得越来越不可取或实用。
Unicode旨在表示所有人类语言的字形,以及许多种符号,并具有各种呈现特性。UTF-8是Unicode的一种高效编码方式,尽管仍然偏向英语。UTF-8是自同步的:通过扫描任一方向上的明确定义的位模式,可以轻松地识别字符边界。
虽然每个UTF-8字符的最大字节数为3,以支持仅2字节地址空间的第0平面(BMP,Basic Multilingual Plane),这可以作为某些应用程序中的最小支持,但支持当前所有17个Unicode平面(截至2019年)的最大字节数为4。值得注意的是,许多流行的“表情符号”字符可能位于第16平面,需要4个字节。
但是,这仅适用于基本字符字形。还有各种修饰符,例如使重音出现在前一个字符上,并且还可以将任意数量的代码点链接在一起构建一个复杂的“字形”。因此,在实际的编程中,使用或假设每个字符的固定最大字节数最终可能会导致应用程序出现问题。
这些考虑意味着在处理之前,UTF-8字符字符串不应该像有时候所做的那样被“扩展”为固定长度的数组。相反,应该直接进行编程,使用专门为UTF-8设计的字符串函数。考虑只是技术上的限制 - 根据当前的UTF8编码方案,最多可以有7个字节跟随。根据规则 - 如果第一个字节不是自包含ASCII字符,则应该具有模式:1(n)0X(7-n),其中n <= 7。
理论上也可能是8个字节,但那么第一个字节就没有零位了。虽然其他方面,如连续字节与前导字节不同(允许错误检测),但我听说11111111字节可能无效,但我不能确定。
最多4个字节的限制很可能是为了与UTF-16兼容,我倾向于认为它已经是一种遗留技术,因为它唯一优越的质量就是处理速度,但仅当字符串字节顺序匹配时(即我们在BOM中读取0xFEFF)。