C# 如何确定;“最低”;编码可能吗?

C# 如何确定;“最低”;编码可能吗?,c#,unicode,utf-8,character-encoding,utf-16,C#,Unicode,Utf 8,Character Encoding,Utf 16,场景 在数据库或服务器中,有许多XML文件以UTF-16的形式存储,空间不是问题。您需要将这些文件中的大部分作为XML文件传送到其他系统,并且尽可能少地使用空间是至关重要的 问题 实际上,只有大约10%存储为UTF-16的文件需要存储为UTF-16,其余文件可以安全地存储为UTF-8,这样就可以了。如果我们可以让那些需要UTF-16的文件成为UTF-16,其余的则是UTF-8,那么我们可以在文件系统上使用大约40%的空间 我们已经尝试使用大量的数据压缩,这很有用,但我们发现UTF-8的压缩比与U

场景

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

问题

实际上,只有大约10%存储为UTF-16的文件需要存储为UTF-16,其余文件可以安全地存储为UTF-8,这样就可以了。如果我们可以让那些需要UTF-16的文件成为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%时间的东西

开发环境

我们在.NETFramework4.0中使用C#

编辑:解决方案

解决方案就是使用UTF-8


这个问题是基于我对UTF的误解,我感谢所有帮助我改正错误的人。谢谢大家!

编辑:我不知道你的问题暗示你认为有Unicode字符串不能安全地编码为UTF-8。事实并非如此。下面的答案假设您真正的意思是,某些字符串将比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。

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

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


只要将所有内容都编码为UTF-8,就不用担心了。

没有字符需要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就可以了。

用UTF-8编码所有内容。UTF-8可以处理UTF-16所能处理的任何事情,而且几乎可以肯定,对于XML文档来说,UTF-8会更小。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将为您提供一个较小的文件,用于存放主要使用印度文、日文、中文或韩文(Kor)编写的文档