针对不同语言的最小Unicode编码?

时间:2008-09-18 12:29:07

标签: unicode

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

E.g。如果我想用最小的字节数来编码一些英文文本,那么平均每个字符的UTF-8为1字节,UTF-16为2,所以我选择UTF-8。

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

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

6 个答案:

答案 0 :(得分:2)

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

对于具有连续字符分配的语言,维基百科上有table with detailed numbers for various languages。通常,UTF-8适用于大多数小字符集(高代码页面上分配的字符集除外),UTF-16适用于双字节字符集。

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

答案 1 :(得分:2)

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

即,UTF8适用于拉丁语,希腊语,西里尔语,希伯来语和阿拉伯语以及其他一些语言。在除拉丁语之外的语言中,字符将占用与UTF16相同的空间,但是您将节省字节数和标点符号。

答案 2 :(得分:2)

如果你真的担心字符串/字符大小,你有没有想过压缩它们?这会自动将字符串缩减为“最小”编码。这是一个令人头痛的问题,特别是如果你想在内存中做这件事,并且有很多情况下它不会给你买任何东西,但编码,尤其是编码,往往是太普通的目的,你看起来的紧凑程度瞄准。

答案 3 :(得分: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 chars处理,并且是UTF-16
  • 在Linux上,Unicode由char处理,并且是UTF-8
  • Java是内部UTF-16,与大多数兼容的XML解析器一样
  • 我被告知(一些技术会议,我对...不感兴趣......)UTF-8是数据库选择的编码。

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

: - )

答案 4 :(得分:1)

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

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

请注意,对于传输,如果您可以压缩(gzip,bz2)数据,则编码无关紧要。 Unicode中字母表的代码点非常接近,因此您希望压缩数据中的公共前缀具有非常短的表示。

UTF-8通常适用于内存中的表示,因为它通常比UTF-32或UTF-16更紧凑,并且与char *上的函数兼容,它们'期望'ASCII或ISO-8859-1 NUL终止字符串。如果您需要通过索引随机访问字符,那么它就没用了。

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

答案 5 :(得分:0)