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

Edd*_*Edd 75 byte character utf-8 character-encoding

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

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

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

Tam*_*más 80

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

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

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

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

  • [CJKV字符](https://en.wikipedia.org/wiki/CJK_characters)大多占用3个字节(一些稀有/古代字符占用4个字节)并且称它们为深奥有点拉伸(仅中国就差不多20个)占世界人口的百分比......). (14认同)
  • 总是试图处理最坏的情况:http://www.hacker9.com/single-message-can-crash-whatsapp.html (7认同)
  • 什么是"esotheric语言"给你?现实世界中存在的任何语言,还是在世界不同语言之间切换的文本?UTF-8-to-String函数的开发人员是否应该选择2,3或4作为乘数,如果他进行了过度分配并且在实际转换后缩小了结果? (3认同)
  • 为什么之前是 6 个,现在限制为 4 个?是什么阻止我们继续使用标准并拥有“11111111”的前导字节和“2^(6*7)”字符位空间? (3认同)
  • @rinntech 所说的“深奥语言”是指一种具有大量高价值 unicode 字符的语言(来自此列表底部附近的内容:http://unicode-table.com/en/sections/)。如果必须过度分配,请选择 4。您可以执行两次传递,一次查看需要并分配多少字节,然后另一次进行编码;这可能比分配大约 4 倍所需 RAM 更好。 (2认同)

Jos*_*son 30

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

回答:6个字节

接受的答案的作者正确地指出这是"原始规范",但我认为这误导了读者,因为据我所知,这仍然是当前和正确的规范,每个维基百科,并根据谷歌的书Java中的UTF-8.

在接受的答案中引用的RFC表明只有四个字节与UTF-16编码相关,所以只有在我们添加上下文时这才是正确的

如果仅将字符从UTF-16转换为UTF-8:4个字节,则回答

现在,UTF-16可以表示的所有字符都有用吗?再次根据维基百科,unicode可以代表高达x10FFFF的代码点.因此,包括0,这意味着我们可以用这些字节做到这一点:F FF FF,即两个和一个半字节或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字节到字节表示的"字符串".也许接受的答案的作者从问题的背景中得到了这个,但这不一定是显而易见的,因此可能会使这个问题的随意读者感到困惑.

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

回答如果去UTF-8 - >本机编码:4个字节

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

  • "这仍然是当前和正确的规范,每个维基百科" - 不再是.写完这篇文章后不久(4月2日编辑),维基百科的UTF-8文章被更改为澄清6个八位字节版本不是当前(2003)UTF-8规范的一部分. (4认同)
  • “ ... [U] nicode最多可以表示x10FFFF个代码点。因此,包括0在内,这意味着我们可以使用以下字节来实现:F FF FF,即两个半字节或20位。” 我相信这有点不正确。从0x0到0x10FFFF的代码点数为0x110000,可以用1F FF FF或21位表示。0x110000数字分别对应于[17个平面](https://en.wikipedia.org/wiki/Plane_%28Unicode%29),每个数字点数均为0x10000。 (2认同)
  • PSA:维基百科不是真正的来源。看看文章的实际参考。 (2认同)