代码之家  ›  专栏  ›  技术社区  ›  Rodney S. Foley

如何确定“最低”编码?

  •  3
  • Rodney S. Foley  · 技术社区  · 14 年前

    脚本

    发行

    实际上,只有大约10%存储为UTF-16的文件需要存储为UTF-16,其余的文件可以安全地存储为UTF-8。如果我们可以有那些需要UTF-16是这样的,其余的是UTF-8,我们可以使用大约40%的文件系统空间少。

    我们已经尝试过使用大量的数据压缩,这是有用的,但我们发现,我们用UTF-8得到的压缩比与用UTF-16得到的压缩比相同,UTF-8的压缩速度也更快。因此,最终如果尽可能多的数据以UTF-8格式存储,我们不仅可以在存储未压缩时节省空间,甚至在压缩时也可以节省更多的空间,甚至可以通过压缩本身节省时间。

    目标

    虽然我们控制XML本身的模式,但从Unicode的角度来看,我们不控制值中可以包含什么类型的“字符串”,因为源代码可以自由地提供Unicode数据来使用。然而,这是罕见的,所以我们不希望每次都使用UTF-16来支持只需要10%时间的东西。

    开发环境

    我们在.Net Framework 4.0中使用C。

    解决方案就是使用UTF-8。

    5 回复  |  直到 14 年前
        1
  •  6
  •   KeithS    14 年前

    用UTF-8编码所有东西。UTF-8可以处理UTF-16所能处理的任何事情,而且几乎可以肯定,对于XML文档来说,它会更小。UTF-8比UTF-16大的唯一情况是,如果文件主要由BMP以外的字符组成,并且在最佳情况下(ASCII规范,包括您可以在标准U.S.104键上键入的所有字符),UTF-8文件的大小将是UTF-16的一半。

    UTF-8对于序号为或低于U07FF的所有符号,每个字符需要2个字节或更少,对于扩展ASCII码页中的任何字符需要1个字节;这意味着对于使用拉丁、希腊、西里尔、希伯来或阿拉伯语字母的现代语言中的任何文档,UTF-8的大小至少等于UTF-16(可能要小得多),包括代数和IPA中使用的大多数常用符号。这就是所谓的基础多语种平面,涵盖了亚洲以外90%以上的官方国家语言。

    一般来说,UTF-16将为您提供一个较小的文件,用于主要使用天成文书(印地语)、日语、汉语或朝鲜文(韩语)字母或任何古老或“深奥”字母(切罗基语或因纽特人?)编写的文档,如果文档大量使用专门的数学、科学、工程或游戏符号,则可能更小。如果您使用的XML是针对印度、中国和日本的本地化文件,那么使用UTF-16可能会得到较小的文件大小,但是您必须使您的程序足够聪明,以便知道本地化文件是这样编码的。

        2
  •  7
  •   Timwi    14 年前

    不能 被安全地编码为UTF-8。事实并非如此。下面的答案假设 这意味着一些字符串将只是更长(需要更多的存储空间)作为UTF-8。


    因此,我最初的直觉是使用UTF-8直到它成为一个问题。这也有助于保持一致性。

    如果您有充分的理由相信XML的很大一部分将是东亚的,那么您只需要担心它。在这种情况下,我会应用一个简单的启发式方法,比如。。。浏览XML并计算大于U+0800的字符数(在UTF-8中是三个字节),只有当大于小于U+0080的字符数(在UTF-8中是一个字节)时,才使用UTF-16。

        3
  •  5
  •   Juho Östman    14 年前

    你永远不需要使用UTF-16而不是UTF-8,选择也不是为了“安全”。两种编码都具有相同的可编码字符库。

        4
  •  4
  •   JSBÕ±Õ¸Õ£Õ¹    14 年前

    没有一个文件 必须是UTF-16

        5
  •  1
  •   Jon Hanna    14 年前

    没有需要UTF-16而不是UTF-8的字符。UTF-8和UTF-16(就这点而言,UTF-32以及其他一些不推荐的格式)都可以对整个UCS进行编码(这就是UTF的含义)。

    有些流在UTF-16中比在UTF-8中小。然而,在实践中,这样的流将很大程度上包含亚洲象形文字是非常简洁的语言。但是,XML需要0x20-0x7F范围内的一些字符,这些字符具有特定的含义,并且经常使用基于字母的脚本作为元素和属性名。

    由于上述这些表意字符的简洁性,XML标记(包括元素和属性名以及小于和大于)与人类悲剧文本的比率将远高于使用字母和音节的语言。出于这个原因,即使在UTF-16中的纯文本明显小于UTF-8中的相同文本的情况下,当涉及到XML时,这种差异将更小,或者UTF-8仍然更小。

    通常,使用UTF-8进行传输和存储。