如何检测文本文件的编码/代码页?

311
在我们的应用程序中,我们从不同的来源接收文本文件( .txt .csv 等)。在读取这些文件时,由于这些文件是使用不同/未知的代码页创建的,因此有时会包含垃圾内容。
是否有一种方法可以自动检测文本文件的代码页? StreamReader 构造函数中的 detectEncodingFromByteOrderMarks 对于 UTF8 和其他标记文件的 unicode 有效,但我正在寻找一种检测代码页(例如 ibm850 windows1252 )的方法。
感谢您的回答,这是我所做的事情。
我们收到的文件来自终端用户,他们对代码页毫不了解。接收器也是终端用户,到目前为止,这就是他们对代码页的了解:代码页存在,并且很麻烦。
解决方案:
  • 在记事本中打开接收到的文件,查看乱码文本。如果某个人被称为弗朗索瓦或其他什么,请利用您的人类智慧猜测一下。
  • 我创建了一个小型应用程序,用户可以使用它来打开文件,并输入用户知道将出现在该文件中的文本,当使用正确的代码页时。
  • 循环遍历所有代码页,并显示提供用户文本解决方案的代码页。
  • 如果有多个代码页弹出,请要求用户指定更多文本。
21个回答

3
StreamReader类的构造函数接受一个“检测编码”的参数。

这里只是涉及到“编码”[链接](https://msdn.microsoft.com/en-us/library/system.io.streamreader%28v=vs.110%29.aspx)..并且描述中说我们必须提供编码.. - SurajS
@SurajS:看一下其他的重载。 - leppie
原作者想要检测一个文件的编码,该文件可能没有BOM标记。StreamReader根据签名从BOM头部检测编码。 public StreamReader( Stream stream, bool detectEncodingFromByteOrderMarks ) - ibondre

1
如果您可以链接到C库,那么您可以使用libenca。请参见http://cihar.com/software/enca/。从man页面中得知:
Enca读取给定的文本文件或标准输入(当没有给出文件时),并利用对它们的语言(必须由您支持)的了解以及解析、统计分析、猜测和黑魔法的混合来确定它们的编码。
它是GPL v2。

1
在AkelPad中打开文件(或者只需复制/粘贴乱码文本),转到编辑 -> 选择 -> 重新编码... -> 勾选“自动检测”。

1

遇到了同样的问题,但还没有找到一个好的自动检测解决方案。 现在我正在使用 PsPad (www.pspad.com) 来处理这个问题 ;) 运行得很好


0

由于它基本上归结为启发式算法,因此使用先前从同一来源接收的文件的编码作为第一个提示可能会有所帮助。

大多数人(或应用程序)每次都以几乎相同的顺序执行操作,通常在同一台机器上,因此当Bob创建一个.csv文件并将其发送给Mary时,它很可能总是使用Windows-1252或他的机器默认值。

尽可能提供一些客户培训也不会伤害 :-)


0

我实际上正在寻找一种通用的、非编程方式来检测文件编码,但我还没有找到。

通过使用不同的编码进行测试,我发现我的文本是UTF-7。

所以我最初做的是:

StreamReader file = File.OpenText(fullfilename);

我不得不将其更改为:

StreamReader file = new StreamReader(fullfilename, System.Text.Encoding.UTF7);

OpenText 假定它是 UTF-8。

你也可以像这样创建 StreamReader:

new StreamReader(fullfilename, true),第二个参数表示它应该尝试从文件的字节顺序标记中检测编码,但在我的情况下没有起作用。


@JohnMachin 我同意这很罕见,但在某些 IMAP 协议的部分中是强制要求的。如果你处于这种情况下,你就不必猜测了。 - tripleee

0

0

尝试通过输入 cpanm Text::Unaccent 安装 Perl 模块 Text::Unaccent::PurePerl,这将生成一个 build.log 文件,在某些应用程序中显示为中文,在其他应用程序中显示为英文。如果您足够幸运地在语言中有空格,则可以通过统计测试比较单词的分布频率来进行合理的尝试。


0
作为对ITmeze帖子的补充,我使用了这个函数来转换C#端口的输出,以适应Mozilla通用字符集检测器。
    private Encoding GetEncodingFromString(string codePageName)
    {
        try
        {
            return Encoding.GetEncoding(codePageName);
        }
        catch
        {
            return Encoding.ASCII;
        }
    }

MSDN

的翻译内容为:

-1
我使用这段代码来检测读取文件时的Unicode和Windows默认ANSI代码页。对于其他编码,需要手动或通过编程进行内容检查。这可以用于以与打开时相同的编码保存文本。(我使用VB.NET)
'Works for Default and unicode (auto detect)
Dim mystreamreader As New StreamReader(LocalFileName, Encoding.Default) 
MyEditTextBox.Text = mystreamreader.ReadToEnd()
Debug.Print(mystreamreader.CurrentEncoding.CodePage) 'Autodetected encoding
mystreamreader.Close()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接