我有一个网络应用程序,允许用户上传其内容进行处理。处理引擎需要 UTF8(并且我正在从多个用户的文件编写 XML),因此我需要确保可以正确解码上传的文件。
因为如果我的用户知道他们的文件,我会感到惊讶were编码,我几乎不希望他们能够正确specify要使用的编码(解码器)。因此,我的应用程序只剩下解码前检测的任务。
这似乎是一个普遍的问题,我很惊讶没有找到解决方案的框架功能或一般配方。难道我没有使用有意义的搜索词进行搜索吗?
我已经实现了 BOM 感知检测(http://en.wikipedia.org/wiki/Byte_order_mark)但我不确定没有 BOM 来指示编码的文件上传的频率,这对于大多数非 UTF 文件没有用。
我的问题归结为:
- BOM 感知检测足以应对绝大多数文件吗?
- 如果BOM检测失败,是否可以尝试不同的解码器并确定它们是否“有效”? (我的尝试表明答案是“不”。)
- 在什么情况下,C# 编码器/解码器框架的“有效”文件会失败?
- 是否有一个存储库包含大量具有各种编码的文件可用于测试?
- 虽然我具体询问的是 C#/.NET,但下次我必须这样做时,我想知道 Java、Python 和其他语言的答案。
到目前为止我发现:
-
带有 Ctrl-S 字符的“有效”UTF-16 文件导致编码为 UTF-8 引发异常(非法字符?)(这是一个 XML 编码异常。)
- 使用 UTF-8 解码有效的 UTF-16 文件succeeds但给出带有空字符的文本。啊?
- 目前,我只期望 UTF-8、UTF-16 和可能的 ISO-8859-1 文件,但我希望解决方案在可能的情况下是可扩展的。
- 我现有的一组输入文件还不够广泛,不足以揭示实时文件会出现的所有问题。
- 尽管我尝试解码的文件是“文本”,但我认为它们通常是使用在文件中留下垃圾字符的方法创建的。因此,“有效”文件可能不是“纯粹的”。噢,喜悦。
Thanks.
不会有绝对可靠的方法,但您也许可以通过一些启发式方法获得“相当不错”的结果。
- 如果数据以 BOM 开头,请使用它。
- 如果数据包含 0 字节,则可能是 utf-16 或 ucs-32。您可以通过查看 0 字节的位置来区分这些以及它们的大端和小端变体
- 如果数据可以解码为utf-8(没有错误),那么它很可能是utf-8(或US-ASCII,但这是utf-8的子集)
- 接下来,如果您想要国际化,请将浏览器的语言设置映射到该语言最可能的编码。
- 最后,假设 ISO-8859-1
当然,“相当好”还是“足够好”取决于您的应用程序。如果您需要确定,您可能希望将结果显示为预览,并让用户确认数据看起来正确。如果没有,请尝试下一个可能的编码,直到用户满意为止。
Note:如果数据包含垃圾字符,该算法将不起作用。例如,原本有效的 utf-8 中的单个垃圾字节将导致 utf-8 解码失败,从而使算法走上错误的道路。您可能需要采取额外措施来处理此问题。例如,如果您可以事先识别可能的垃圾,请在尝试确定编码之前将其剥离。 (如果你剥离得太激进也没关系,一旦确定了编码,你就可以解码原始未剥离的数据,只需配置解码器以替换无效字符而不是抛出异常。)或者计算解码错误并适当加权。但这可能在很大程度上取决于垃圾的性质,即您可以做出什么假设。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)