UTF-8编码字符的最大字节数是多少?

时间:2012-03-02 12:26:12

标签: utf-8 character-encoding byte character

单个UTF-8编码字符的最大字节数是多少?

我将加密以UTF-8编码的字符串的字节,因此需要能够计算出UTF-8编码字符串的最大字节数。

有人可以确认单个UTF-8编码字符的最大字节数

3 个答案:

答案 0 :(得分:71)

根据RFC3629将字符表限制为U+10FFFF,每个字符的最大字节数为4:

  

在UTF-8中,U + 0000..U + 10FFFF范围内的字符(UTF-16      可访问范围)使用1到4个八位字节的序列进行编码。

(原始规范允许代码点超过U+10FFFF最多六个字节的字符代码。)

代码小于128的字符只需要1个字节,接下来的1920个字符代码只需要2个字节。除非你使用深奥的语言,否则将字符数乘以4将是一个重要的高估。

答案 1 :(得分:29)

如果没有进一步的上下文,我会说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字节到字节表示的“字符串”。也许接受的答案的作者从问题的背景中得到了这个,但这不一定是显而易见的,所以可能会使这个问题的随意读者感到困惑。

从UTF-8转到本机编码,我们必须看看如何实现“字符串”。有些语言,比如Python&gt; = 3,将代表每个具有整数代码点的字符,这允许每个字符4个字节= 32位,以覆盖我们对unicode所需的21个字符,但有些浪费。为什么不完全是21位?因为字节对齐时事情会更快。 Python&lt; = 2和Java等语言表示使用UTF-16编码的字符,这意味着他们必须使用代理项对来表示扩展的unicode(而不是BMP)。无论哪种方式,仍然是最多4个字节。

如果去UTF-8则回答 - &gt;本机编码:4个字节

所以,最后的结论,4是最常见的正确答案,所以我们做对了。但是,里程可能会有所不同。

答案 2 :(得分:0)

支持US-ASCII(标准英语字母编码)的最大字节数为1。但是随着时间的流逝,将文本限制为英语变得越来越不可取或不切实际。

Unicode旨在代表所有人类语言的标志符号以及多种具有各种渲染特征的符号。 UTF-8是Unicode的高效编码,尽管它仍然偏向英语。 UTF-8是自同步的:通过在任一方向上扫描定义明确的位模式,可以轻松识别字符边界。

虽然每个UTF-8字符的最大字节数为3,仅支持平面0(基本多语言平面(BMP))的2字节地址空间,但是在某些应用程序中它可以作为最小支持被接受, 4个以支持当前所有17个Unicode平面(截至2019年)。应该注意的是,许多流行的“表情符号”字符很可能位于16平面中,这需要4个字节。

但是,这仅适用于基本字符字形。还有各种修饰符,例如使重音符号出现在前一个字符上,并且还可以将任意数量的代码点链接在一起以构造一个复杂的“字形”。因此,在现实世界的编程中,每个字符使用或假设使用固定的最大字节数最终可能会给您的应用程序带来麻烦。

这些考虑因素意味着,在处理之前,不应将UTF-8字符串“扩展”为固定长度的数组,这有时是可以做到的。相反,应该使用专门为UTF-8设计的字符串函数直接进行编程。