单个 UTF-8 编码字符的最大字节数是多少?
我将加密以 UTF-8 编码的字符串的字节,因此需要能够计算出 UTF-8 编码的字符串的最大字节数。
有人可以确认单个 UTF-8 编码字符的最大字节数吗
根据将字符表限制为 U+10FFFF
的 RFC3629,每个字符的最大字节数为 4:
在 UTF-8 中,来自 U+0000..U+10FFFF 范围(UTF-16 可访问范围)的字符使用 1 到 4 个八位字节的序列进行编码。
(原始规范允许超过 U+10FFFF
的代码点最多使用 6 个字节的字符代码。)
代码小于 128 的字符只需要 1 个字节,接下来的 1920 个字符代码只需要 2 个字节。除非您使用深奥的语言,否则将字符数乘以 4 将是一个严重的高估。
如果没有进一步的上下文,我会说 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 >= 3 将用整数代码点表示每个字符,这允许每个字符 4 个字节 = 32 位来覆盖我们需要的 21 个 unicode,但有一些浪费。为什么不完全是 21 位?因为当它们是字节对齐时,事情会更快。一些语言,如 Python <= 2 和 Java 使用 UTF-16 编码表示字符,这意味着它们必须使用代理对来表示扩展的 unicode(而不是 BMP)。无论哪种方式,这仍然是最大 4 个字节。
回答是否使用 UTF-8 -> 本机编码:4 个字节
所以,最后的结论是,4 是最常见的正确答案,所以我们做对了。但是,里程可能会有所不同。
1F FF FF
或 21 位表示。 0x110000 数字对应于每个 0x10000 个代码点的 17 planes。
支持 US-ASCII(一种标准的英文字母编码)的最大字节数为 1。但是随着时间的推移,将文本限制为英文变得越来越不理想或不实用。
Unicode 旨在表示所有人类语言的字形,以及多种符号,具有多种呈现特性。 UTF-8 是 Unicode 的一种有效编码,尽管仍然偏向于英语。 UTF-8 是自同步的:通过在任一方向上扫描明确定义的位模式,可以轻松识别字符边界。
虽然每个 UTF-8 字符的最大字节数为 3,仅支持平面 0 的 2 字节地址空间,基本多语言平面 (BMP),在某些应用程序中可以接受为最小支持,但它是 4,用于支持所有 17 个当前 Unicode 平面(截至 2019 年)。需要注意的是,许多流行的“表情符号”字符很可能位于平面 16,这需要 4 个字节。
但是,这仅适用于基本字符字形。还有各种修饰符,例如使重音出现在前一个字符上,也可以将任意数量的代码点链接在一起以构造一个复杂的“字素”。因此,在现实世界的编程中,使用或假设每个字符的最大字节数是固定的,最终可能会给您的应用程序带来问题。
这些考虑意味着 UTF-8 字符串在处理之前不应“扩展”为固定长度的数组,就像有时所做的那样。相反,应该直接使用专为 UTF-8 设计的字符串函数进行编程。
仅考虑技术限制 - 按照当前的 UTF8 编码方案,最多可以有 7 个字节。根据它 - 如果第一个字节不是自给自足的 ASCII 字符,则它应该具有模式:1(n)0X(7-n),其中 n <= 7。
理论上它也可以是 8,但是第一个字节根本没有零位。虽然其他方面,如与前导不同的连续字节,仍然存在(允许错误检测),但我听说字节 11111111 可能是无效的,但我不能确定这一点。
最大 4 字节的限制最有可能与 UTF-16 兼容,我倾向于认为这是一个遗留问题,因为它唯一擅长的质量是处理速度,但前提是字符串字节顺序匹配(即我们在 BOM 中读取 0xFEFF )。
不定期副业成功案例分享
11111111
的前导字节和用于字符的2^(6*7)
位空间?