一尘不染

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

algorithm

我的程序必须读取使用各种编码的文件。它们可以是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格式,我希望达到90的高。

我正在寻找一种确定这种情况的通用算法。但是我实际上使用的是Delphi
2009,它知道Unicode并具有一个TEncoding类,因此特定于此的将是一个额外的好处。


回答:

ShreevatsaR的回答使我在Google上搜索“通用编码检测器delphi”,这使我仅活了大约45分钟就把这篇文章列在#1位置,这让我感到惊讶!那是快速的Googlebotting!同样令人惊讶的是,Stackoverflow如此迅速地获得了第一名。

Google的第二个条目是Fred
Eaker在Blog上发表的有关字符编码检测的条目,其中列出了各种语言的算法。

我在该页面上发现了Delphi的提法,它使我直接进入以Delphi编写并基于Mozilla的i18n组件的FreeOpenSource
ChsDet Charset Detector

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


阅读 239

收藏
2020-07-28

共1个答案

一尘不染

也许您可以掏出一个使用Chardet:Universal Encoding
Detector
的Python脚本。它是Firefox使用的字符编码检测的重新实现,并且被许多不同的应用程序使用。有用的链接:Mozilla的代码,其基于的研究论文(具有讽刺意味的是,我的Firefox无法正确检测该页面的编码),简短说明详细说明

2020-07-28