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

时间:2008-12-16 22:59:26

标签: algorithm delphi encoding delphi-2009 byte-order-mark

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

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

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

当文件没有BOM时,扫描某些文件的最佳方法是什么,最准确地猜测编码类型?如果文件是ANSI,我希望接近100%的时间,如果是UTF格式,我希望接近100。

我正在寻找一种通用的算法来确定这一点。但我实际上使用Delphi 2009,它知道Unicode并且有一个TEncoding类,所以特定的东西将是一个奖励。


答案:

ShreevatsaR的回答让我在Google上搜索“通用编码检测器delphi”,这让我感到惊讶,因为这个帖子在活着只有大约45分钟后被列为#1位置!这是快速googlebotting !!同样令人惊讶的是Stackoverflow如此迅速地进入第一名。

Google的第二个条目是Fred Eaker在Character encoding detection上的一篇博客文章,列出了各种语言的算法。

我发现在该页面上提到了Delphi,它直接导致我用Delphi编写的基于Mozilla的i18n组件的the Free OpenSource ChsDet Charset Detector at SourceForge

优秀!谢谢所有回复的人(全+1),谢谢ShreevatsaR,再次感谢Stackoverflow,帮助我在不到一个小时内找到答案!

4 个答案:

答案 0 :(得分:9)

也许你可以发现使用Chardet: Universal Encoding Detector的Python脚本。它是Firefox使用的字符编码检测的重新实现,由many different applications使用。有用的链接:Mozilla's coderesearch paper它基于(具有讽刺意味的是,我的Firefox无法正确检测该网页的编码),short explanationdetailed explanation

答案 1 :(得分:5)

答案 2 :(得分:4)

我的猜测是:

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

答案 3 :(得分:1)

ASCII?没有现代操作系统使用ASCII了。他们都使用8位代码,至少,这意味着它是UTF-8,ISOLatinX,WinLatinX,MacRoman,Shift-JIS或其他任何东西。

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

我知道的大多数编辑都是通过让用户从所有可能的编码列表中选择默认值来解决此问题。

有代码用于检查UTF字符的有效性。