unicode - 是否可以将类似于 UTF-8 的编码限制为每个字符 3 个字节?

标签 unicode utf-8 character-encoding

UTF-8需要4个字节来表示BMP之外的字符。这并不;它并不比 UTF-16 或 UTF-32 差。但它并不是最佳的(就存储空间而言)。

有 13 个字节(C0-C1 和 F5-FF)从未使用过。以及未使用的多字节序列,例如与“超长”编码相对应的序列。如果这些可用于对字符进行编码,那么更多的字符可以用 2 字节或 3 字节序列表示(当然,代价是使实现更加复杂)。

是否可以通过类似于 UTF-8 的编码(每个字符最多 3 个字节)来表示所有 1,114,112 个 Unicode 代码点?如果不是,这种编码可以表示的最大字符数是多少?

“类似 UTF-8”,我的意思是,至少:

  • 字节 0x00-0x7F 保留用于 ASCII 字符。
  • 面向字节的 find/index 函数正常工作。您无法像在 Shift-JIS 中那样从字符中间开始找到误报。

更新——我第一次尝试回答这个问题

假设您有 UTF-8 样式的前导/尾随字节分类。让:

  • A = 单字节字符数
  • B = 用于 2 字节字符的前导字节的值的数量
  • C = 用于 3 字节字符的前导字节的值的数量
  • T = 256 - (A + B + C) = 用于尾随字节的值的数量

那么可以支持的字符数为N = A + BT + CT²。

给定 A = 128,最佳值是 B = 0 和 C = 43。这允许 310,803 个字符,或大约 Unicode 代码空间的 28%。

是否有不同的方法可以编码更多字符?

最佳答案

记录所有 Unicode 代码点(假设您的数字是正确的)需要 20 多位,剩下 24 中的 3 位用于编码哪个字节是哪个。这应该足够了。

与不遵循既定标准所造成的损失相比,我看不出这样做会带来什么好处。

编辑:再次阅读规范,您希望为前 128 个代码点保留 0x00 到 0x7f 的值。这意味着 3 个字节中只有 21 位来编码剩余的 1,113,984 个代码点。 21 位勉强够用,但它并没有真正为您提供足够的额外空间来明确地进行编码。或者至少我还没有找到办法,所以我正在改变我的答案。

至于你的动机,保持好奇心并进行一些思考练习当然没有错。但思维练习的重点是你自己去做,而不是试图让整个互联网为你做这件事!至少在提出问题时要坦率地说明这一点。

关于unicode - 是否可以将类似于 UTF-8 的编码限制为每个字符 3 个字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3011272/

相关文章:

string - 我可以破坏 []byte 和字符串之间的数据转换吗?

html - 如果在内容类型 header 中发送字符集,仍然建议通过元标记在 head 标记中发送吗?

Python3 计算字符串中的 UTF-16 代码点

c - 如何计算C中unicode字符串中的字符

python - 带有日语字符的MySQL

python - 为什么我在用python读取文件的过程中遇到unicode编码错误?

java - 我正在 Java 中使用 Writer 类进行 UTF8 编码输出。写入时如何插入新行?

objective-c - "incomplete universal character name"与 stringWithUTF8String

python - 无法从 Python 2.x 下 pandas 的列名中删除 unicode 字符

unicode - 在任何时候,以 UTF-8 编码的文本永远不会为我们提供超过以 UTF-16 编码的相同文本的 +50% 的文件大小。真假?