我有一个Web应用程序,允许用户上传他们的内容进行处理。处理引擎需要UTF8(我正在从多个用户的文件中编写XML),因此我需要确保能够正确解码上传的文件。
如果我的任何用户都知道他们的文件 编码,我会感到惊讶,我很少希望他们能够正确指定编码(解码器)使用。因此,我的应用程序在解码之前需要进行检测。
这似乎是一个普遍的问题,我很惊讶没有找到解决方案的框架功能或一般配方。是不是我没有搜索有意义的搜索词呢?
我已经实现了BOM感知检测(http://en.wikipedia.org/wiki/Byte_order_mark),但我不确定文件上传的频率是多少用于表示编码,这对大多数非UTF文件都没用
我的问题归结为:
到目前为止,我发现:
感谢。
答案 0 :(得分:3)
没有绝对可靠的方法,但你可以用一些启发式方法得到“相当不错”的结果。
“相当不错”是否“足够好”取决于您的应用程序,当然。如果您需要确定,可能需要将结果显示为预览,并让用户确认数据正确。如果没有,请尝试下一个可能的编码,直到用户满意为止。
注意:如果数据包含乱码,则此算法无效。例如,否则有效的utf-8中的单个垃圾字节将导致utf-8解码失败,从而使算法走错了路径。您可能需要采取其他措施来处理此问题。例如,如果您可以事先识别可能的垃圾,请在尝试确定编码之前将其删除。 (如果剥离过于激进无关紧要,一旦确定了编码,就可以解码原始的未剥离数据,只需将解码器配置为替换无效字符而不是抛出异常。)或者计算解码错误并适当加权。但这可能在很大程度上取决于垃圾的性质,即你可以做出什么样的假设。
答案 1 :(得分:2)
您是否曾尝试从用户那里阅读文件的代表性横截面,通过您的程序运行它们,测试,纠正任何错误并继续前进?
我发现File.ReadAllLines()在各种应用程序中非常有效,而不必担心所有的编码。它似乎处理得很好。
一旦我弄清楚如何正确使用它,Xmlreader()做得相当不错。
也许您可以发布一些具体的数据示例并获得更好的回复。
答案 2 :(得分:1)
这是一个众所周知的问题。您可以尝试执行Internet Explorer正在执行的操作。这是CodeProject中的一个很好的article,它描述了Microsoft对该问题的解决方案。然而,没有任何解决方案是100%准确的,因为一切都是基于heuristcs。假设BOM存在也是不安全的。
答案 3 :(得分:1)
您可能希望查看名为chardet的基于Python的解决方案。它是Mozilla代码的Python端口。虽然您可能无法直接使用它,但它的文档非常值得一读,就像它引用的原始Mozilla文章一样。
答案 4 :(得分:0)
我遇到了类似的问题。我需要一个powershell脚本来确定文件是否是文本编码的(以任何常见的编码方式)。
这绝对不是详尽无遗的,但这是我的解决方案......