什么是最准确的编码检测器?
经过一番调查,我发现java世界里有几个编码检测项目,如果InputStreamReader
中的getEncoding
不起作用:
- juniversalchardet
- jchardet
- cpdetector
- 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。
与其他应用程序进行整合比较容易,并取得了很好的效果。