在我们的应用程序中,我们接收来自不同来源的文本文件(.txt.csv等).在读取时,这些文件有时包含垃圾,因为这些文件是在不同/未知的代码页中创建的.

有没有办法(自动)检测文本文件的代码页?

StreamReader构造函数上的detectEncodingFromByteOrderMarks适用于UTF8和其他unicode标记的文件,但我正在寻找一种检测代码页的方法,比如ibm850windows1252.


谢谢你的回答,这就是我所做的.

我们收到的文件来自最终用户,他们没有关于代码页的线索.接收者也是最终用户,到目前为止,他们对代码页的了解是这样的:代码页是存在的,而且很烦人.

Solution:

  • 在记事本中打开收到的文件,看一段乱码.如果有人叫弗朗索瓦什么的,用你的人类智慧你可以猜到.
  • 我已经创建了一个小应用程序,用户可以使用它打开文件,并输入一个用户知道的文本,当使用正确的代码页时,它将出现在文件中.
  • 循环浏览所有代码页,并用用户提供的文本显示给出解决方案的代码页.
  • 如果一个代码页弹出多个,请用户指定更多文本.

推荐答案

您无法检测到代码页,需要告知您.您可以分析字节并猜测它,但这可能会给出一些奇怪(有时很有趣)的结果.我现在找不到,但我相信记事本可以用中文显示英文文本.

不管怎样,这就是你需要阅读的内容:

特别是乔尔说:

The Single Most Important Fact About Encodings

如果你完全忘记了我刚才解释的一切,请记住一个极其重要的事实.在不知道字符串使用什么编码的情况下拥有字符串是没有意义的.您不能再把头埋在沙子里,假装"纯"文本是ASCII. 没有明文这回事.

如果你有一个字符串,在内存中,在文件中,或在邮箱消息中,你必须知道它是什么编码,否则你无法解释它或向用户正确显示它.

.net相关问答推荐

.NET restore/build在使用组织包的Github Action工作流中调用时获得401

Azure SignalR 和微服务

如何在 Windows 窗体上显示 ClickOnce 版本号

即时窗口中的动态导致Microsoft.CSharp.RuntimeBinder.Binder未定义或导入错误

调整小数精度,.net

为什么 StyleCop 建议在方法或属性调用前加上this?

您是否使用 TestInitialize 或测试类构造函数来准备每个测试?为什么?

为什么我得到 411 Length required 错误?

如何 Select 数据表中列的最小值和最大值?

如何在 EF 代码优先中禁用链接表的级联删除?

如何右对齐 DataGridView 列中的文本?

调用委托与方法的性能

双倍的? = 双倍? + 双倍?

C#中的引用类型

将 StreamReader 返回到开头

安装带有恢复操作的 Windows 服务以重新启动

序列化和反序列化 .NET 对象的最快方法

在 C#/.NET 中合并两个图像

如何从 webclient 获取状态码?

通过反射获取公共静态字段的值