适用于不同语言的最小Unicode编码?
不同语言的不同unicode编码的典型平均每字符字节率是多少?
例如。如果我想用最少的字节来编码一些英文文本,那么平均每个字符UTF-8将为1个字节,而UTF-16将为2个字节,因此我选择UTF-8.
如果我想要一些韩文文字,那么UTF-16可能平均每个字符大约2个字符,而UTF-8可能平均大约3个字符(我不知道,我只是在这里举例说明一些数字)。
哪种编码对不同语言和字符集的存储要求最小?
解决方案
对于任何给定的语言,由于大多数语言都分配给连续的代码页,因此每个字符的字节速率相当恒定。重音拉丁字符是一个很大的例外,在代码空间中分配的这些拉丁字符比无重音形式的高。我没有这些的确切数字。
对于具有连续字符分配的语言,维基百科上有一张表格,其中列出了各种语言的详细编号。通常,UTF-8适用于大多数小型字符集(在高代码页上分配的字符集除外),而UTF-16适用于两字节字符集。
如果需要更密集的压缩,则可能还需要查看Unicode技术说明14,该说明比较了一些旨在减少各种语言的数据大小的特殊用途的编码。但是这些技术并不是特别常见。
UTF-8
JoelOnSoftware上有一篇关于unicode的很好的文章:
每个软件开发人员绝对必须绝对了解Unicode和字符集(没有任何借口!)
UTF8最适用于字符主要在U + 0800以下的任何字符集。否则为UTF16.
也就是说,UTF8适用于拉丁文,希腊文,西里尔文,希伯来文和阿拉伯文以及其他一些语言。在除拉丁语以外的其他语言中,字符将占用与UTF16中相同的空间,但是我们将在标点和间距上节省字节。
如果我们真的担心字符串/字符的大小,是否考虑过压缩它们?这样会自动将字符串缩减为"最小"编码。这是一个令人头疼的问题,尤其是如果我们想在内存中进行操作,并且在很多情况下它不会给我们带来任何好处,但是尤其是编码,对于我们看上去紧凑的级别而言,它往往过于通用瞄准。
在UTF-16中,所有重要的语言(即克林贡语,精灵和其他奇怪的事物)都将被编码为2个字节的字符。
因此,问题是要找到具有2个字节或者1个字节大小字符的字形的语言。
在UTF-8上的Wikipedia页面中:
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是数据库中选项的编码。
所以,拿起你的毒药...
:-)
我不知道确切的数字,但是对于日语,Shift_JIS平均每个字符的字节数少于UTF-8,EUC-JP也是如此,因为它们针对日语文本进行了优化。但是,它们没有覆盖与Unicode相同的代码点空间,因此它们可能不是我们问题的正确答案。
对于日语字符(每个字符2个字节,而不是3个字符),UTF-16优于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"的含义。