如何确定“最低”编码可能?

时间:2010-09-16 22:53:41

标签: c# unicode utf-8 character-encoding utf-16

方案

在数据库或服务器上有很多XML文件存储为UTF-16,而空间不是问题。您需要将大部分这些文件作为XML文件提供给其他系统,并且尽可能少地占用空间至关重要。

问题

实际上,只有大约10%的以UTF-16存储的文件需要存储为UTF-16,其余的可以安全地存储为UTF-8并且没问题。如果我们可以将那些需要UTF-16的那些,并且其余的是UTF-8,我们可以在文件系统上减少大约40%的空间。

我们试图对数据进行大量压缩,这很有用,但我们发现我们得到的UTF-8压缩率与UTF-8相同,UTF-8压缩速度也更快。因此,最终如果尽可能多的数据存储为UTF-8,我们不仅可以在存储解压缩时节省空间,即使压缩也可以节省更多空间,我们甚至可以节省压缩本身的时间

目标

要确定XML文件中何时需要UTF-16的Unicode字符,我们只能在必要时使用UTF-16。

有关XML文件和数据的一些详细信息

虽然我们控制XML本身的模式,但是我们无法控制从Unicode角度看哪些类型的“字符串”,因为源可以自由提供要使用的Unicode数据。然而,这种情况很少见,因此我们不希望每次只使用UTF-16来支持只需要10%时间的东西。

开发环境

我们正在使用带有.Net Framework 4.0的C#。

编辑:解决方案

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

问题是基于我对UTF的误解,我感谢所有帮助我的人。谢谢!

5 个答案:

答案 0 :(得分:7)

编辑:我没有意识到您的问题意味着您认为存在无法安全编码为UTF-8的Unicode字符串。不是这种情况。以下答案假设您真正意味着某些字符串只会更长(占用更多存储空间)为UTF-8。


我想说甚至不到10%的文件需要存储为UTF-16。即使您的XML包含大量的中文,日文,韩文或UTF-8中比UTF-16更大的其他语言,如果该语言中的文本多于XML语法,那么它仍然只是一个问题。 / p>

因此,我最初的直觉是“使用UTF-8,直到它出现问题”。它也是一致的。

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

答案 1 :(得分:6)

以UTF-8编码所有内容。 UTF-8可以处理任何UTF-16,并且在XML文档的情况下几乎肯定会更小。 UTF-8大于UTF-16的唯一情况是,如果文件主要由BMP之外的字符组成,并且在最好的情况下(ASCII-spec,其中包括您可以在标准美国上键入的每个字符) 104键)UTF-8文件的大小是UTF-16的一半。

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

作为一般规则,UTF-16将为您提供较小的文件,主要用于以天城文(印地语),日文,中文或韩文(韩文)字母或任何古代或“深奥”字母(切诺基)编写的文件。或Inuit任何人?),如果文件大量使用专门的数学,科学,工程或游戏符号,可能会更小。如果您使用的XML是针对印度,中国和日本的本地化文件,您可以使用UTF-16获得更小的文件大小,但是您必须使您的程序足够智能,以便知道本地化文件是以这种方式编码的

答案 2 :(得分:5)

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

答案 3 :(得分:4)

没有文件必须是UTF-16 。任何UTF-16文档也可以编码为UTF-8。从理论上讲,文件可能有一个比UTF-16更大的文件,但这种情况几乎不太可能,并且不值得强调。

只需将所有内容编码为UTF-8并停止担心。

答案 4 :(得分:1)

没有字符需要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进行传输和存储。

编辑:刚刚注意到你也在压缩。在这种情况下,平衡更不重要,只需使用UTF-8并完成它。