Unicode 在任何时候,用UTF-8编码的文本都不会给我们提供超过a+;UTF-16编码的相同文本的50%文件大小。对/错?

Unicode 在任何时候,用UTF-8编码的文本都不会给我们提供超过a+;UTF-16编码的相同文本的50%文件大小。对/错?,unicode,utf-8,character-encoding,ansi,overhead,Unicode,Utf 8,Character Encoding,Ansi,Overhead,我在某个地方读到(重新措辞): 如果我们将UTF-8编码的文件与UTF-16编码的文件进行比较,有时UTF-8文件可能会增大50%到100%的文件大小 我说这篇文章是错误的,是不是因为在任何时候,UTF-8编码的文本都不会给我们提供超过UTF-16编码的相同文本+50%的文件大小?如果字符有一个字节,再加上第二个字节,我会称之为100%的增加,而不是50%。我想这就是作者的意思 如果我将X字符和N字节/字符写入一个文件,那么该文件中将包含NX字节。因此,您可以看到,将每个字符的字节数增加两倍或三

我在某个地方读到(重新措辞):

如果我们将UTF-8编码的文件与UTF-16编码的文件进行比较,有时UTF-8文件可能会增大50%到100%的文件大小


我说这篇文章是错误的,是不是因为在任何时候,UTF-8编码的文本都不会给我们提供超过UTF-16编码的相同文本+50%的文件大小?

如果字符有一个字节,再加上第二个字节,我会称之为100%的增加,而不是50%。我想这就是作者的意思

如果我将
X
字符和
N
字节/字符写入一个文件,那么该文件中将包含
NX
字节。因此,您可以看到,将每个字符的字节数增加两倍或三倍会对文件大小产生线性影响

在UTF-8中,0-127之间的每个代码点都存储在一个字节中。只有128及以上的代码点使用2、3存储,事实上,最多使用6个字节

虽然UTF-8字符最多可以使用4个字节(理论上可以使用更多字节),但它并不用于包含“几乎所有现代语言”的

基本多语言平面(包含几乎所有常用字符)的其余部分需要三个字节。Unicode的其他平面中的字符需要四个字节,其中包括不太常见的CJK字符和各种历史脚本

所以我想100%的开销,虽然理论上是可能的,但对于典型的现代语言来说是不可能的。为了实现这一点,您必须使用来自补充多语言平面的一些异国情调,它在UTF-8中使用4个字节

对于HTML文档或混合文本,可能不需要切换到UTF-16以节省空间:

字符U+0800到U+FFFF在UTF-8中使用三个字节,但在UTF-16中仅使用两个字节。因此,如果这些字符多于ASCII字符,那么(例如)中文、日文或印地语文本在UTF-8中可能占用更多的空间。这种情况发生在纯文本中,但很少发生在HTML文档中。例如,维基百科上的日文UTF-8和印地语Unicode文章如果保存为UTF-16,则比原始UTF-8版本占用更多空间


Joel Spolsky写了一篇关于Unicode的伟大文章,我真的可以推荐它:


答案是,在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个字节

这些事情确实各不相同。您只能在精确文本上获得精确数字,而不能在常规文本上获得精确数字。亚洲文本中的代码点需要1、2、3或4个字节的UTF-8,而在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是以换行符分隔的文本跨距数
  • Word是以空格分隔的文本跨距数
  • Graphs是Unicode扩展grapheme集群的数量,有时称为glyph。这些是用户可见的字符
  • 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%。如果查看“行”和“字”列,则可能是由于使用了空格
  • 我希望这能回答你的问题。与这些相同的文本为enco时相比,使用UTF-8编码时,东方语言的大小没有+50%到+100%的增长
                       UTF-8   UTF-16
    U+0000..U+007F       1        2
    U+0080..U+07FF       2        2
    U+0800..U+FFFF       3        2
    U+010000..U+10FFFF   4        4