什么是最准确的编码检测器?

经过一番调查,我发现java世界里有几个编码检测项目,如果InputStreamReader中的getEncoding不起作用:

  1. juniversalchardet
  2. jchardet
  3. cpdetector
  4. ICU4J

但是,我真的不知道哪一个是最好的。 任何人都可以通过亲身体验告诉我哪一个是Java中最好的?

我已经在一些CSV文件中检查了juniversalchardet和ICU4J,结果是不一致的:juniversalchardet有更好的结果:

  • UTF-8:都检测到。
  • Windows-1255:juniversalchardet检测到有足够的希伯来字母,ICU4J仍然认为是ISO-8859-1。 随着更多的希伯来语字母,ICU4J将其检测为ISO-8859-8,这是另一个希伯来语编码(因此文本正常)。
  • SHIFT_JIS(日文):juniversalchardet检测到,ICU4J认为是ISO-8859-2。
  • ISO-8859-1:由ICU4J检测,不受juniversalchardet支持。

所以我们应该考虑一下他最有可能处理的编码。 最后我select了ICU4J

请注意,ICU4J仍然保持。

另外请注意,您可能想要使用ICU4J,并且如果它因为没有成功而返回null,请尝试使用juniversalchardet。 或者相反。

Apache Tika的 AutoDetectReader正是这样做的 – 首先尝试使用HtmlEncodingDetector,然后使用UniversalEncodingDetector(基于juniversalchardet),然后尝试Icu4jEncodingDetector(基于ICU4J)。

我在网上find了答案:

http://fredeaker.blogspot.com/2007/01/character-encoding-detection.html

它在这里说了一些可以借鉴的东西:

字符编码检测器的优势在于它的重点是在于统计分析还是HTML META和XML序言发现。 如果您正在处理具有META的HTML文件,请使用cpdetector。 否则,您最好的select是monq.stuff.EncodingDetector或com.sun.syndication.io.XmlReader。

所以这就是为什么我现在使用cpdetector 。 我将更新与它的结果的职位。

我个人在我们的项目中使用了jchardet(juniversalchardet当时不可用),只是为了检查一个stream是否是UTF-8。

与其他应用程序进行整合比较容易,并取得了很好的效果。