3

设想

您有很多 XML 文件以 UTF-16 格式存储在数据库或空间不成问题的服务器上。您需要将大部分需要获取到其他系统的文件作为 XML 文件使用,并且尽可能少地使用空间是至关重要的。

问题

实际上,以 UTF-16 格式存储的文件中只有大约 10% 需要以 UTF-16 格式存储,其余的可以安全地以 UTF-8 格式存储并且没问题。如果我们可以让需要 UTF-16 的那些是这样的,而其余的是 UTF-8,我们可以在文件系统上使用大约 40% 的空间。

我们尝试对数据进行很好的压缩,这很有用,但我们发现使用 UTF-8 获得的压缩率与使用 UTF-16 获得的压缩率相同,而且 UTF-8 的压缩速度也更快。因此,最终如果尽可能多的数据以UTF-8存储,我们不仅可以在解压缩存储时节省空间,即使在压缩时我们仍然可以节省更多空间,我们甚至可以通过压缩本身节省时间.

目标

弄清楚 XML 文件中何时有需要 UTF-16 的 Unicode 字符,因此我们只能在必须时使用 UTF-16。

关于 XML 文件和数据的一些细节

虽然我们控制 XML 本身的模式,但从 Unicode 角度来看,我们不控制值中可以包含什么类型的“字符串”,因为源可以免费提供 Unicode 数据以供使用。但是,这种情况很少见,因此我们不希望每次都使用 UTF-16 来支持仅 10% 的时间需要的东西。

开发环境

我们将 C# 与 .Net Framework 4.0 一起使用。

编辑:解决方案

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

这个问题是基于我对 UTF 的误解,我感谢大家帮助我解决问题。谢谢!

4

5 回答 5

7

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


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

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

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

于 2010-09-16T22:59:30.827 回答
6

用 UTF-8 编码所有内容。UTF-8 可以处理 UTF-16 可以处理的任何内容,而且对于 XML 文档来说几乎肯定会更小。UTF-8 大于 UTF-16 的唯一情况是文件主要由 BMP 以外的字符组成,并且在最好的情况下(ASCII 规范,包括您可以在标准 US 上键入的每个字符) 104 键)一个 UTF-8 文件将是 UTF-16 大小的一半。

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

作为一般规则,UTF-16 将为您提供一个较小的文件,用于存储主要以梵文(印地语)、日语、中文或韩语(韩语)字母或任何古代或“深奥”字母(切诺基或因纽特人)编写的文档?),并且在大量使用专业数学、科学、工程或游戏符号的文档的情况下可能会更小。如果您正在使用的 XML 用于印度、中国和日本的本地化文件,您可能会使用 UTF-16 获得较小的文件大小,但您必须使您的程序足够聪明,以知道本地化文件是这样编码的.

于 2010-09-17T00:52:10.540 回答
5

您永远“不需要”使用 UTF-16 而不是 UTF-8,而且选择与“安全”无关。两种编码具有相同的可编码字符库。

于 2010-09-16T22:59:51.163 回答
4

没有文档必须是 UTF-16这样的东西。任何 UTF-16 文档也可以编码为 UTF-8。从理论上讲,UTF-8 比 UTF-16 大的文档是可能的,但这几乎不可能,也不值得强调。

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

于 2010-09-16T23:04:19.687 回答
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 就可以了。

于 2010-09-16T23:08:55.827 回答