代码之家  ›  专栏  ›  技术社区  ›  lkessler

当BOM(字节顺序标记)丢失时,我如何最好地猜测编码?

  •  29
  • lkessler  · 技术社区  · 16 年前

    我的程序必须读取使用各种编码的文件。它们可能是ANSI、UTF-8或UTF-16(大端序或小端序)。

    当BOM(字节顺序标记)存在时,我没有问题。我知道文件是UTF-8、UTF-16 BE还是LE。

    我想假设当没有BOM表时,文件是ANSI的。但我发现我处理的文件经常缺少BOM。因此,没有BOM可能意味着文件是ANSI、UTF-8、UTF-16BE或LE。

    当文件没有BOM表时,扫描一些文件并最准确地猜测编码类型的最佳方法是什么?如果文件是ANSI格式,我希望在接近100%的情况下都是正确的,如果是UTF格式,我想在高90度的情况下也是正确的。

    我正在寻找一种通用的算法方法来确定这一点。但我实际上使用的是Delphi 2009,它知道Unicode,并且有一个TEncoding类,所以专门针对它的东西会是一个额外的好处。


    答案:

    ShreevatsaR的回答让我在谷歌上搜索“通用编码检测器delphi”,这让我感到惊讶,因为这篇文章在我只活了大约45分钟后就被列在了第一位!这是快速的谷歌搜索!!同样令人惊讶的是,Stackoverflow如此迅速地排名第一。

    谷歌上的第二个条目是Fred Eaker在 Character encoding detection 它列出了各种语言的算法。

    我在那页上找到了德尔菲的名字,这让我直接想到了 the Free OpenSource ChsDet Charset Detector at SourceForge 用Delphi编写,基于Mozilla的i18n组件。

    好极了!感谢所有回答的人(全部+1),感谢ShreevatsaR,再次感谢Stackoverflow在不到一个小时的时间里帮助我找到答案!

    4 回复  |  直到 16 年前
        1
  •  9
  •   community wiki 2 revs ShreevatsaR    16 年前

    也许你可以使用一个Python脚本 Chardet: Universal Encoding Detector 。它是Firefox使用的字符编码检测的重新实现,由 many different applications .有用链接: Mozilla's code , research paper 它基于(具有讽刺意味的是,我的Firefox未能正确检测到该页面的编码), short explanation , detailed explanation .

        2
  •  5
  •   Community CDub    11 年前

    这里是 how notepad does that

    还有 python Universal Encoding Detector 你可以检查一下。

        3
  •  4
  •   Vilx-    16 年前

    我的猜测是:

    • 首先,检查文件的字节值是否小于32(制表符/换行符除外)。如果是这样,它就不能是ANSI或UTF-8。因此-UTF-16。只需要弄清楚结尾。为此,您可能应该使用一些有效的Unicode字符代码表。如果遇到无效代码,如果合适,请尝试其他端序。如果其中一个适合(或不适合),请检查哪个字母数字代码的百分比更大。您也可以尝试搜索换行符,并从中确定行尾。除此之外,我不知道如何检查字节序。
    • 如果文件不包含小于32的值(除了所述空格),则可能是ANSI或UTF-8。尝试将其解析为UTF-8,看看是否有任何无效的Unicode字符。如果你这样做,它可能是ANSI。
    • 如果你期望文档采用非英语单字节或多字节非Unicode编码,那么你就倒霉了。你能做的最好的事情就是像Internet Explorer这样的东西,它会制作一个字符值的直方图,并将其与已知语言的直方图进行比较。它经常工作,但有时也会失败。你必须为每种语言准备一个庞大的字母直方图库。
        4
  •  1
  •   Thomas Tempelmann    16 年前

    ASCII?现代操作系统不再使用ASCII。它们至少都使用8位代码,这意味着它要么是UTF-8、ISOLatinX、WinLatinX,要么是MacRoman、Shift-JIS或其他任何代码。

    我所知道的唯一测试是检查无效的UTF-8字符。如果你发现了,那么你就知道它不可能是UTF-8。UTF-16可能也是如此。但是当它没有Unicode集时,就很难分辨它可能是哪个Windows代码页。

    我认识的大多数编辑器都是通过让用户从所有可能的编码列表中选择默认编码来处理这个问题的。

    有代码可以检查UTF字符的有效性。

    推荐文章