我对文件,流和不同的代码页都很陌生。 看到这是我的问题:
我得到了文本文件,其中一些是使用代码页Windows-1252创建的,有些仍然是IBM850,有时它们是UTF8。当我导入它们时,我的数据库会显示ä,ö,ü,ß的各种符号,因为我用错误的代码页读取它们。只有当我使用正确的代码页导入它们时,一切正常。
这是我认为可能是一个好方法:
使用代码页X
将ä,ö,ü,ß转换为字节数组例如:
byte[] myAeKl = Encoding.GetEncoding("IBM850").GetBytes("ä");
byte[] myAeGr = Encoding.GetEncoding("IBM850").GetBytes("Ä");
浏览文本文件,并将每个字母字节数组与上面的字节数组进行比较。 如果发现使用该代码页,否则尝试另一个代码页。
这是我不明白的: 如何比较文本文件中字母的字节数与我要查找的字母的字节数组。 例如:
if (Textfile.Letter == myAeKl || Textfile.Letter == myAeGr)
...
有没有其他方法可以获得正确的代码页? 我是否对解决方案有正确的帮助?
答案 0 :(得分:3)
遗憾的是,没有一种万无一失的方法,因为某个字节流在多个编码中都有意义。
这样做的一种方法是使用其他业务数据进行猜测和启发式扫描。你能从文件名中推断出编码吗?从其他一些元数据,如发件人名称?如果是这样,请尝试使用它进行过滤。
如果没有,你可以尝试挖掘和猜测。如果文件可能很大,正如你所说,只需查看并引入一个文本样本(例如,前512个字节,这应该就足够了)。你有什么方法可以猜测内容是什么吗?是英文/希伯来文的自由文本还是类似的东西?如果是这样,请查找512字节样本中的常用字。这些文件是否包含固定格式?如果是这样,请寻找它。然后在实时样本上运行这些测试,查看结果,调整测试,然后再试一次,直到你有更好的机会识别编码。
祝你好运!答案 1 :(得分:0)
我会尝试使用一种编码加载文件,如果遇到意外的字符,请将其加载到另一个字符。