字符编码检测算法

时间:2009-04-21 18:56:33

标签: java character-encoding

我正在寻找一种检测文档中字符集的方法。我一直在这里阅读Mozilla字符集检测实现:

Universal Charset Detection

我还发现了一个名为jCharDet的Java实现:

JCharDet

这两个都是基于使用一组静态数据进行的研究。我想知道的是,是否有人成功使用过任何其他实现,如果有的话,是什么?你有自己的方法吗?如果是的话,你用来检测字符集的算法是什么?

任何帮助将不胜感激。我不是在寻找通过谷歌的现有方法列表,也不是在寻找Joel Spolsky文章的链接 - 只是为了澄清:)

更新:我对此进行了大量研究,最终找到了一个名为cpdetector的框架,该框架使用可插入的方法进行字符检测,请参阅:

CPDetector

这提供了BOM,chardet(Mozilla方法)和ASCII检测插件。编写自己的代码也很容易。还有另一个框架,它提供了更好的字符检测,Mozilla方法/ jchardet等......

ICU4J

为cpdetector编写自己的插件非常容易,它使用此框架来提供更准确的字符编码检测算法。它比Mozilla方法更好。

2 个答案:

答案 0 :(得分:9)

多年前,我们对邮件应用程序进行了字符集检测,我们推出了自己的字符集检测。邮件应用程序实际上是一个WAP应用程序,手机预计UTF-8。有几个步骤:

<强>通用

我们可以很容易地检测文本是否是UTF-8,因为在字节2/3 /等的顶部位中存在特定的位模式。一旦您发现该模式重复了一定次数,您就可以确定它是UTF-8。

如果文件以UTF-16字节顺序标记开头,您可以假设文本的其余部分是该编码。否则,检测UTF-16并不像UTF-8那么容易,除非您可以检测代理对模式:但代理对的使用很少,因此通常不起作用。 UTF-32类似,只是没有要检测的代理对。

区域检测

接下来我们假设读者在某个地区。例如,如果用户看到用日语本地化的UI,我们就可以尝试检测三种主要的日文编码。 ISO-2022-JP再次向东以检测逃逸序列。如果失败,确定EUC-JP和Shift-JIS之间的差异并不是那么简单。用户更有可能接收Shift-JIS文本,但EUC-JP中的字符在Shift-JIS中不存在,反之亦然,因此有时候你可以得到一个很好的匹配。

中国编码和其他地区使用相同的程序。

用户选择

如果这些效果不理想,用户必须手动选择编码。

答案 1 :(得分:7)

不完全符合您的要求,但我注意到ICU project包含CharsetDetector类。