【问题标题】:What is the most accurate encoding detector? [closed]什么是最准确的编码检测器? [关闭]
【发布时间】:2011-04-15 03:12:03
【问题描述】:

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

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

但是,我真的不知道哪个是最好的。有实践经验的大神能告诉我哪一个是 Java 最好的吗?

【问题讨论】:

  • 注意 InputStreamReader.getEncoding() 只是返回构造函数中传递的编码,或者平台默认编码,它对流数据没有任何作用。
  • 谢谢!我知道这一点。这就是为什么我如此渴望找出哪个是最好的。
  • 还有Apache Tika,好像是基于ICU4J的。
  • FWIW,ICU4J 也带有代码页转换功能,因此可以从检测到的一组更新的编码执行转换。

标签: java character-encoding


【解决方案1】:

我个人在我们的项目中使用了 jchardet(当时还没有juniversalchardet),只是为了检查流是否为 UTF-8。

与其他应用程序相比,它更容易与我们的应用程序集成,并产生了很好的结果。

【讨论】:

    【解决方案2】:

    我在网上找到了答案:

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

    这里说了一些有价值的东西:

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

    这就是我现在使用 cpdetector 的原因。我会用它的结果更新帖子。

    【讨论】:

    • 您只关心已经通过 XML 或 META 用字符集标记的文件吗?该测试非常非常可疑(以至于我自己运行了它)。它使用的测试文件不是真实的内容,而是代码图表。即,它们不是“编码 X 的文本”,而是“带有编码 X 的代码点列表的英文文本”。但是,所有测试文件都带有编码标记。应该进行比较,但不要与这些测试文件进行比较。
    • 进一步测试:我在该博客中针对未标记数据的相同检测器(最新版本)运行了测试用例。仅检测到 icu:euc-jp、iso-2022-jp、koi8-r、iso-2022-cn iso-2022-kr.... 仅检测到 ICU 和 Mozilla jchardet:shift-jis、gb18030、big5... I使用来自source.icu-project.org/repos/icu/icu/trunk/source/extra/uconv/… 和 utf-8 目录的样本(一些从那里的文件转换为目标代码页)。
    【解决方案3】:

    我在一些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 不支持。

    因此,应该考虑他最有可能必须处理的编码。 最后我选择了ICU4J

    请注意,ICU4J 仍在维护中。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-18
      • 2010-11-17
      • 2013-03-19
      • 2017-02-07
      • 1970-01-01
      • 2020-04-12
      • 2010-10-17
      • 1970-01-01
      相关资源
      最近更新 更多