不同语言中不同 unicode 编码的典型平均每字符字节数是多少?
例如,如果我想要最少的字节数来编码一些英文文本,那么平均而言,UTF-8 将是每个字符 1 个字节,而 UTF-16 将是 2,所以我会选择 UTF-8。
如果我想要一些韩文文本,那么 UTF-16 可能平均每个字符大约 2 个,但 UTF-8 可能平均大约 3 个(我不知道,我只是在这里编一些说明性数字)。
哪种编码对不同的语言和字符集产生最小的存储要求?
不同语言中不同 unicode 编码的典型平均每字符字节数是多少?
例如,如果我想要最少的字节数来编码一些英文文本,那么平均而言,UTF-8 将是每个字符 1 个字节,而 UTF-16 将是 2,所以我会选择 UTF-8。
如果我想要一些韩文文本,那么 UTF-16 可能平均每个字符大约 2 个,但 UTF-8 可能平均大约 3 个(我不知道,我只是在这里编一些说明性数字)。
哪种编码对不同的语言和字符集产生最小的存储要求?
对于任何给定的语言,每个字符的字节数比率都相当稳定,因为大多数语言都分配给连续的代码页。最大的例外是重音拉丁字符,它们在代码空间中的分配高于非重音形式。对于这些,我没有确切的数字。
对于具有连续字符分配的语言,在 Wikipedia 上有一个表格,其中包含各种语言的详细编号。一般来说,UTF-8 适用于大多数小字符集(除了在高代码页上分配的字符集),而 UTF-16 适用于两字节字符集。
如果您需要更密集的压缩,您可能还想查看Unicode Technical Note 14,其中比较了一些旨在减少各种语言数据大小的特殊用途编码。但这些技术并不是特别常见。
UTF8 最适合字符主要低于 U+0800 的任何字符集。否则为 UTF16。
也就是说,UTF8 表示拉丁文、希腊文、西里尔文、希伯来文和阿拉伯文等。在拉丁语以外的语言中,字符将占用与在 UTF16 中相同的空间,但您将节省标点符号和间距的字节。
如果您真的担心字符串/字符大小,您是否考虑过压缩它们?这会自动将字符串减少到它的“最小”编码。这是令人头疼的一层,尤其是如果您想在内存中执行此操作,并且在很多情况下它不会给您带来任何好处,但是尤其是编码对于您看起来的紧凑程度而言往往过于通用要瞄准。
在 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/
符合您要求的语言。
:-)
现在,请注意,根据您使用的框架,选择很可能不是您的选择:
所以,拿起你的毒药...
:-)
我不知道确切的数字,但对于日语 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”是什么意思。