C#:如何找出我是否有正确的编码

本文关键字:编码 是否 何找出 | 更新日期: 2023-09-27 18:21:24

我对文件、流和不同的代码页很陌生。看看这是我的问题:

我得到了文本文件,其中一些是用代码页Windows-1252创建的,有些仍然是IBM850,有时是UTF8。当我导入它们时,我的数据库会显示ä、ö、ü、ß的各种符号,因为我读错了代码页。只有当我用正确的代码页导入它们时,一切都很好。

这是我认为可能是一个很好的方法:

使用代码页X 将ä,ö,ü,ß转换为字节数组

例如:

byte[] myAeKl = Encoding.GetEncoding("IBM850").GetBytes("ä");
byte[] myAeGr = Encoding.GetEncoding("IBM850").GetBytes("Ä");

浏览文本文件,并将每个字母字节数组与上面的数组进行比较。如果找到,请使用该代码页,否则请尝试其他代码页。

这是我不明白的:如何将文本文件中字母的字节与我要查找的字母的字节数组进行比较。例如:

if (Textfile.Letter == myAeKl || Textfile.Letter == myAeGr)
...

有其他方法可以获得正确的代码页吗?我有权找到解决方案吗?

C#:如何找出我是否有正确的编码

不幸的是,没有一种万无一失的方法,因为某个字节流在多个编码中可能是有意义的。

一种方法是使用其他业务数据进行猜测和启发。你能从文件名推断出编码吗?来自其他一些元数据,比如发件人姓名?如果是,请尝试使用它进行筛选。

如果没有,你可以试着挖掘和猜测。如果文件可能很大,就像你说的那样,只需偷看并引入一个文本样本(比如说,前512个字节就足够了)。你有办法猜测内容是什么吗?是英语/希伯来语的自由文本还是类似的?如果是,请在512字节的样本中查找常见单词。这些文件包含固定格式吗?如果是,请查找它。然后在实际样本上运行这些测试,查看结果,调整测试,然后重试,直到您有相对较好的机会识别编码。

祝你好运!

我会尝试用一种编码加载文件,如果遇到意外的字符,就用另一种编码来加载。