什么是UTF-8编码字符的最大字节数?

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

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

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

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

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

(原始规范允许最多6个字节的字符代码,用于U+10FFFF代码点。)

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

没有进一步的上下文,我会说UTF-8中字符的最大字节数是

回答:6个字节

被接受的答案的作者正确地指出这是“原始规范”,但我认为这会误导读者,因为据我所知,这仍然是目前和正确的规范,每个维基百科和每本Google书Java中的UTF-8 。

接受的答案中引用的RFC指出,只有四个字节与UTF-16编码相关,因此只有在添加上下文

如果只将字符从UTF-16转换为UTF-8:4字节,则应答

现在,UTF-16可以表示的所有字符都有用吗? 再次根据维基百科 ,unicode可以代表高达x10FFFF代码点。 因此,包括0,这意味着我们可以用这些字节来完成:F FF FF,即2.5字节或20位。 回顾一下UTF-8规范,我们可以看到,我们可以用最多四个UTF-8编码字节来表示20位。 所以

如果覆盖所有unicode,则回答4个字节

但是,在Java <= v7中 ,他们谈论用UTF-8表示unicode的最大值是3个字节? 这是因为原始的unicode规范只定义了基本的多语言平面( BMP ),即它是unicode的一个老版本,或者是现代unicode的子集。 所以

回答如果只代表原始的unicode,则BMP:3个字节

但是,OP在谈论另一种方式。 不是从字符到UTF-8字节,而是从UTF-8字节到string的string表示。 也许被接受的答案的作者是从问题的背景中得到的,但这不一定是明显的,所以可能会混淆这个问题的偶然读者。

从UTF-8到本地编码,我们必须看看如何实现“string”。 某些语言(如Python> = 3)将用整数代码点表示每个字符,这允许每个字符4个字节= 32位来覆盖我们需要的Unicode,这有些浪费。 为什么不完全是20位? 因为字节alignment的时候事情会更快。 像Python <= 2和Java这样的语言代表使用UTF-16编码的字符,这意味着它们必须使用代理对来表示扩展的Unicode(不是BMP)。 无论哪种方式,最多仍然是4个字节。

回答如果是UTF-8 – >本地编码:4字节

所以,最后的结论是,4是最常见的正确答案,所以我们说得对。 但是,在某些情况下,你应该小心。 例如,不要指望您可以表示您从UTF-8stream中读取的最多4个字节的内容。 如果不是unicode,则可能需要多达6个字节。