2

不同语言中不同 unicode 编码的典型平均每字符字节数是多少?

例如,如果我想要最少的字节数来编码一些英文文本,那么平均而言,UTF-8 将是每个字符 1 个字节,而 UTF-16 将是 2,所以我会选择 UTF-8。

如果我想要一些韩文文本,那么 UTF-16 可能平均每个字符大约 2 个,但 UTF-8 可能平均大约 3 个(我不知道,我只是在这里编一些说明性数字)。

哪种编码对不同的语言和字符集产生最小的存储要求?

4

6 回答 6

2

对于任何给定的语言,每个字符的字节数比率都相当稳定,因为大多数语言都分配给连续的代码页。最大的例外是重音拉丁字符,它们在代码空间中的分配高于非重音形式。对于这些,我没有确切的数字。

对于具有连续字符分配的语言,在 Wikipedia 上有一个表格,其中包含各种语言的详细编号。一般来说,UTF-8 适用于大多数小字符集(除了在高代码页上分配的字符集),而 UTF-16 适用于两字节字符集。

如果您需要更密集的压缩,您可能还想查看Unicode Technical Note 14,其中比较了一些旨在减少各种语言数据大小的特殊用途编码。但这些技术并不是特别常见。

于 2008-09-18T12:32:30.913 回答
2

UTF8 最适合字符主要低于 U+0800 的任何字符集。否则为 UTF16。

也就是说,UTF8 表示拉丁文、希腊文、西里尔文、希伯来文和阿拉伯文等。在拉丁语以外的语言中,字符将占用与在 UTF16 中相同的空间,但您将节省标点符号和间距的字节。

于 2008-09-18T12:40:02.017 回答
2

如果您真的担心字符串/字符大小,您是否考虑过压缩它们?这会自动将字符串减少到它的“最小”编码。这是令人头疼的一层,尤其是如果您想在内存中执行此操作,并且在很多情况下它不会给您带来任何好处,但是尤其是编码对于您看起来的紧凑程度而言往往过于通用要瞄准。

于 2008-09-18T12:42:18.143 回答
1

在 UTF-16 中,所有重要的语言(即除了克林贡语、精灵和其他奇怪的东西之外的任何语言)都将被编码为 2 字节字符。

所以问题是找到具有 2 字节或 1 字节大小字符的字形的语言。

在 UTF-8 的维基百科页面中: http ://en.wikipedia.org/wiki/Utf-8

我们看到,Unicode 索引为 0x0800 或更大的字符在 UTF-8 中至少有 3 个字节长。

知道了,你只需要看看 unicode 上的代码图表:http ://www.unicode.org/charts/

符合您要求的语言。

:-)

现在,请注意,根据您使用的框架,选择很可能不是您的选择:

  • 在 Windows API 上,Unicode 由 wchar_t 字符处理,并且是 UTF-16
  • 在 Linux 上,Unicode 由 char 处理,并且是 UTF-8
  • Java 内部是 UTF-16,大多数兼容的 XML 解析器也是如此
  • 有人告诉我(一些我不感兴趣的技术会议......对不起......)UTF-8 是数据库选择的编码。

所以,拿起你的毒药...

:-)

于 2008-09-18T12:51:41.803 回答
1

我不知道确切的数字,但对于日语 Shift_JIS 平均每个字符的字节数比 UTF-8 少,EUC-JP 也是如此,因为它们针对日语文本进行了优化。但是,它们不涵盖与 Unicode 相同的代码点空间,因此它们可能不是您问题的正确答案。

UTF-16 对于日语字符(每个字符 2 个字节而不是 3 个)优于 UTF-8,但如果有很多 7 位字符,则比 UTF-8 差。这取决于上下文 - 技术文本更有可能包含 1 字节范围内的大量字符。经典的日语文本可能没有。

请注意,对于传输,如果您可以压缩(gzip,bz2)数据,则编码并不重要。Unicode 中字母的代码点非常接近,因此您会期望在压缩数据中具有非常短的表示的通用前缀。

UTF-8 通常适合在内存中表示,因为它通常比 UTF-32 或 UTF-16 更紧凑,并且与 char* 上的函数兼容,这些函数“期望”ASCII 或 ISO-8859-1 NUL 终止的字符串。但是,如果您需要按索引随机访问字符,那将毫无用处。

如果您不关心非 BMP 字符,UCS-2 总是每个字符 2 个字节,因此提供随机访问。但这取决于你所说的“Unicode”是什么意思。

于 2008-09-18T13:02:02.387 回答
0

UTF-8

JoelOnSoftware 上有一篇关于 unicode 的非常好的文章:

每个软件开发人员绝对、绝对必须了解 Unicode 和字符集的绝对最低要求(没有借口!)

于 2008-09-18T12:35:06.663 回答