【发布时间】:2011-01-19 19:48:11
【问题描述】:
我有一个网络应用程序,允许用户上传他们的内容进行处理。处理引擎需要 UTF8(我正在从多个用户的文件中组合 XML),所以我需要确保我可以正确解码上传的文件。
如果我的任何用户知道他们的文件甚至被编码,我会感到惊讶,我不太希望他们能够正确指定编码(解码器)使用。因此,我的应用程序的任务是在解码之前进行检测。
这似乎是一个普遍的问题,我很惊讶没有找到解决方案的框架功能或通用配方。会不会是我没有使用有意义的搜索词进行搜索?
我已经实现了 BOM 感知检测 (http://en.wikipedia.org/wiki/Byte_order_mark),但我不确定文件将多久上传一次 w/oa BOM 以指示编码,这对大多数非 UTF 文件没有用处。
我的问题归结为:
- 对于绝大多数文件来说,BOM 感知检测是否足够?
- 在 BOM 检测失败的情况下,是否可以尝试不同的解码器并确定它们是否“有效”? (我的尝试表明答案是否定的。)
- 在什么情况下,使用 C# 编码器/解码器框架的“有效”文件会失败?
- 是否有任何地方的存储库包含大量具有各种编码的文件以用于测试?
- 虽然我专门询问 C#/.NET,但我想知道 Java、Python 和其他语言的答案,以便下次我必须这样做。
到目前为止,我发现:
-
具有 Ctrl-S 字符的“有效”UTF-16 文件导致编码为 UTF-8 引发异常(非法字符?)(这是一个 XML 编码异常。)时间> - 使用 UTF-8 解码一个有效的 UTF-16 文件成功,但给出的文本包含空字符。嗯?
- 目前,我只希望使用 UTF-8、UTF-16 和可能的 ISO-8859-1 文件,但如果可能,我希望解决方案可以扩展。
- 我现有的输入文件集不够广泛,无法发现实时文件会出现的所有问题。
- 虽然我试图解码的文件是“文本”,但我认为它们通常是使用在文件中留下垃圾字符的方法创建的。因此“有效”文件可能不是“纯”文件。哦,快乐。
谢谢。
【问题讨论】:
-
是什么让您认为 UTF-8 和 UTF-16 兼容?一个以单字节块存储数据,另一个以 2 字节块存储数据......
-
BOM 主要用于 Microsoft 操作系统,Unices 更喜欢没有 BOM 的编码。
-
是否允许使用
Ctrl-S字符,与您的格式无关。 UTF-8 和 UTF-16 都能够编码Ctrl-S,只是对于软件(使用获得的 UTF-8)这个字符可能是意外的。 -
如果你解码一个 UTF-16 文件就像它是 UTF-8,当然你会在每个第二个字节得到空字符。故事是字符
0以UTF-8 编码为字节0x30,但在UTF-16 中编码为两个字节0x30 0x00(0x0030)。 -
@Matthew:您是否建议我可以在同一个 XML 文件中混合使用 UTF-8 和 UTF-16 编码的字符串? @Vlad - 它不是任何特定的软件死了它实际上是 C# 核心 System.Xml.Linq.XElement.WriteTo(XmlWriter) 抛出异常的方法(虽然代码已经改变所以我无法通过大量工作重现错误)。
标签: c# string utf-8 multilingual utf-16