我在某处读到(改写):
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 中。每一列的含义如下:
我将这些语言分为西拉丁语、西方非拉丁语和东方语。观察:
我希望这能回答你的问题。与使用 UTF-16 编码的相同文本相比,使用 UTF-8 编码的东方语言的大小没有 +50% 到 +100% 的增加。只有在获取单个代码点时,您才会看到这样的数字,这是一个完全不合理的指标。
关于unicode - 在任何时候,以 UTF-8 编码的文本永远不会为我们提供超过以 UTF-16 编码的相同文本的 +50% 的文件大小。真假?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6883434/