我的程序必须读取使用各种编码的文件。它们可以是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,帮助我在不到一个小时内找到答案!
答案 0 :(得分:9)
也许你可以发现使用Chardet: Universal Encoding Detector的Python脚本。它是Firefox使用的字符编码检测的重新实现,由many different applications使用。有用的链接:Mozilla's code,research paper它基于(具有讽刺意味的是,我的Firefox无法正确检测该网页的编码),short explanation,detailed explanation。
答案 1 :(得分:5)
答案 2 :(得分:4)
我的猜测是:
答案 3 :(得分:1)
ASCII?没有现代操作系统使用ASCII了。他们都使用8位代码,至少,这意味着它是UTF-8,ISOLatinX,WinLatinX,MacRoman,Shift-JIS或其他任何东西。
我所知道的唯一测试是检查无效的UTF-8字符。如果您发现任何,那么您知道它不能是UTF-8。 UTF-16可能也是如此。但是当它没有设置Unicode时,就很难分辨出它可能是哪个Windows代码页。
我知道的大多数编辑都是通过让用户从所有可能的编码列表中选择默认值来解决此问题。
有代码用于检查UTF字符的有效性。