我的程序必须读取使用各种编码的文件。它们可能是 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 类,所以特定于它的东西将是一个额外的好处。
Answer:
ShreevatsaR 的回答让我在 Google 上搜索“通用编码检测器 delphi”,令我惊讶的是,在我只活了大约 45 分钟后,这篇文章就被列在了 #1 的位置!那是快速的谷歌机器人!!同样令人惊讶的是 Stackoverflow 如此迅速地排名第一。
Google 中的第二条条目是 Fred Eaker 的博客条目字符编码检测 http://fredeaker.blogspot.com/2007/01/character-encoding-detection.html列出了各种语言的算法。
我在该页面上发现了 Delphi 的提及,它直接引导我SourceForge 的免费开源 ChsDet 字符集检测器 http://chsdet.sourceforge.net/用 Delphi 编写并基于 Mozilla 的 i18n 组件。
极好的!谢谢所有回答的人(全部+1),谢谢ShreevatsaR,再次感谢Stackoverflow,帮助我在不到一个小时的时间内找到了答案!
也许你可以编写一个Python脚本来使用Chardet:通用编码检测器 http://chardet.feedparser.org/。它是 Firefox 使用的字符编码检测的重新实现,并由许多不同的应用 http://diveintomark.org/archives/2008/03/05/upstream。有用的链接:Mozilla 的代码 http://mxr.mozilla.org/seamonkey/source/extensions/universalchardet/src/base/, 研究论文 http://www.mozilla.org/projects/intl/UniversalCharsetDetection.html它基于(讽刺的是,我的 Firefox 无法正确检测该页面的编码),简短的解释 http://chardet.feedparser.org/docs/faq.html#faq.impossible, 详细解释 http://chardet.feedparser.org/docs/how-it-works.html.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)