unicode - 在任何时候,以 UTF-8 编码的文本永远不会为我们提供超过以 UTF-16 编码的相同文本的 +50% 的文件大小。真假?

标签 unicode utf-8 character-encoding ansi overhead

我在某处读到(改写):

If we compare a UTF-8 encoded file VS a UTF-16 encoded file, At some times, the UTF-8 file may give a 50% to 100% larger file size



我说这篇文章是错误的,因为 是否正确?任何时候 , 以 UTF-8 编码的文本将 从不给我们 UTF-16 编码的相同文本的超过 50% 的文件大小?

最佳答案

答案是在 UTF-8 中,ASCII 只有 1 个字节,但一般来说,包括英语在内的大多数西方语言在这里和那里使用一些需要 2 个字节的字符,因此实际百分比有所不同。当以 UTF-8 编码时,希腊语和西里尔语语言的脚本中每个字符都至少需要 2 个字节。

常见的东方语言要求 UTF-8 中的字符为 3 个字节,而 UTF-16 中的字符为 2 个。但是请注意,“不常见”的东方字符在 UTF-8 和 UTF-16 中都需要 4 个字节。

3 确实只比 2 大 50%。但这仅适用于单个代码点。它不适用于整个文件。

实际百分比不可能精确地说明,因为您不知道代码的平衡点是在 1 字节还是 2 字节 UTF-8 范围内,还是在 4 字节 UTF-8 范围内。如果亚洲文本中有空格,那么这只是 UTF-8 的一个字节,但它是 UTF-16 的一个昂贵的 2 个字节。

这些事情确实有所不同。您只能在精确文本上获得精确数字,而不能在一般文本上获得精确数字。亚洲文本中的代码点占用 UTF-8 的 1、2、3 或 4 个字节,而在 UTF-16 中,它们各需要 2 或 4 个字节。

案例分析

比较东京上各种语言的维基百科页面,看看我的意思。即使在东方语言中,仍然有大量的 ASCII 出现。仅此一项就会使您的数字波动。考虑:

Paras Lines Words Graphs Chars  UTF16 UTF8   8:16 16:8  Language

 519  1525  6300  43120 43147  86296 44023   51% 196%  English
 343   728  1202   8623  8650  17302  9173   53% 189%  Welsh
 541  1722  9013  57377 57404 114810 59345   52% 193%  Spanish
 529  1712  9690  63871 63898 127798 67016   52% 191%  French
 321   837  2442  18999 19026  38054 21148   56% 180%  Hungarian

 202   464   976   7140  7167  14336 11848   83% 121%  Greek
 348   937  2938  21439 21467  42936 36585   85% 117%  Russian

 355   788   613   6439  6466  12934 13754  106%  94%  Chinese, simplified
 209   419   243   2163  2190   4382  3331   76% 132%  Chinese, traditional
 461  1127  1030  25341 25368  50738 65636  129%  77%  Japanese
 410   925  2955  13942 13969  27940 29561  106%  95%  Korean

每一个都是东京维基百科页面另存为文本,不像 HTML。所有文本都在 NFC 中,而不是在 NFD 中。每一列的含义如下:
  • Paras 是空白行分隔的文本跨度的数量。
  • Lines 是换行符分隔的文本跨度的数量。
  • Words 是空格分隔的文本跨度的数量。
  • Graphs 是 Unicode 扩展字素簇的数量,有时也称为字形。这些是用户可见的字符。
  • Chars 是 Unicode 代码点的数量。这些是或应该是程序员可见的字符。
  • UTF16 是文件存储为 UTF-16 时占用的字节数。
  • UTF8 是文件存储为 UTF-8 时占用的字节数。
  • 8:16 是 UTF-8 大小与 UTF-16 大小的比率,以百分比表示。
  • 16:8 是 UTF-16 大小与 UTF-8 大小的比率,以百分比表示。
  • 语言是我们在这里谈论的东京页面的哪个版本。

  • 我将这些语言分为西拉丁语、西方非拉丁语和东方语。观察:
  • 使用拉丁文字的西方语言在从 UTF-8 转换为 UTF-16 时受到的影响很大,英语受到的影响最大,扩展了 96%,匈牙利语扩展了 80%。都是巨大的。
  • 不使用拉丁文字的西方语言仍然受到影响,但只有 15-20%。
  • 东方语言不会像每个人声称的那样在 UTF-8 中受苦! 看:
  • 在韩语和(简体)中文中,UTF-8 只比 UTF-16 大 6%。
  • 在日语中,UTF-8 只比 UTF-16 大 29%。
  • 繁体中文实际上在 UTF-8 中比在 UTF-16 中变小了!实际上,对于此示例,使用 UTF-16 比使用 UTF-8 花费 32%。如果您查看 Lines 和 Words 列,看起来这可能是由于使用了空格。

  • 我希望这能回答你的问题。与使用 UTF-16 编码的相同文本相比,使用 UTF-8 编码的东方语言的大小没有 +50% 到 +100% 的增加。只有在获取单个代码点时,您才会看到这样的数字,这是一个完全不合理的指标。

    关于unicode - 在任何时候,以 UTF-8 编码的文本永远不会为我们提供超过以 UTF-16 编码的相同文本的 +50% 的文件大小。真假?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6883434/

    相关文章:

    internet-explorer - IE 无法下载带有 unicode 路径名的 bmp 文件

    html - 每个浏览器都支持所有 unicode 吗?

    utf-8 - 为什么 USB 对字符串使用 UTF-16(为什么不使用 UTF-8)

    python - Unicode解码错误: 'utf8' codec can't decode byte 0xc3 in position 34: unexpected end of data

    python - pytest 无法在 Python 2.7 下处理 README 中 doctest 中的 Unicode

    java - 如何为索引准备 Unicode 字符串?

    ios - 附加图像数据后,NSData变为零

    php - 特殊字符未在 TEXTBOX 中正确显示

    oracle - 如何检查客户端的NLS_LANG?

    tomcat - 覆盖 Spring MVC freemarker 数据绑定(bind)字符编码