首页 / 知识

适用于不同语言的最小Unicode编码?

2023-04-17 02:53:00

适用于不同语言的最小Unicode编码?

Smallest Unicode encodings for different languages?

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

例如。 如果我想用最少的字节来编码一些英文文本,那么平均每个字符UTF-8将为1个字节,而UTF-16将为2个字节,因此我选择UTF-8。

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

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


如果您真的担心字符串/字符的大小,是否考虑过压缩它们?这样会自动将字符串缩减为"最小"编码。这是一个令人头疼的问题,尤其是如果您想在内存中这样做,并且在很多情况下它不会给您带来任何好处,但是尤其是编码,对于您看上去紧凑的级别而言,它往往过于通用瞄准。


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

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


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

对于具有连续字符分配的语言,维基百科上有一张表格,其中列出了各种语言的详细编号。通常,UTF-8适用于大多数小型字符集(在高代码页上分配的字符集除外),而UTF-16适用于两字节字符集。

如果需要更密集的压缩,则可能还需要查看Unicode技术说明14,它比较了一些旨在减少各种语言的数据大小的特殊用途的编码。但是这些技术并不是特别普遍。


我不知道确切的数字,但是对于日语,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"的含义。


在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是数据库中选项的编码。

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

:-)


UTF-8

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

每个软件开发人员绝对,肯定必须绝对了解Unicode和字符集(无借口!)


编码语言字符文本

最新内容

相关内容

猜你喜欢