猜测 Java 中表示为 byte[] 的文本的编码

2022-09-01 06:08:04

给定一个表示某些未知编码(通常是 UTF-8 或 ISO-8859-1,但不一定是这样)的文本的字节数组,那么猜测最可能的编码(在 Java 中)的最佳方法是什么?

值得注意的是:

  • 没有其他元数据可用。从字面上看,字节数组是唯一可用的输入。
  • 检测算法显然不是100%正确的。如果算法在超过80%的情况下是正确的,那就足够好了。

答案 1

以下方法使用 juniversalchardet 解决了这个问题,juniversalchardet 是 Mozilla 编码检测库的 Java 端口。

public static String guessEncoding(byte[] bytes) {
    String DEFAULT_ENCODING = "UTF-8";
    org.mozilla.universalchardet.UniversalDetector detector =
        new org.mozilla.universalchardet.UniversalDetector(null);
    detector.handleData(bytes, 0, bytes.length);
    detector.dataEnd();
    String encoding = detector.getDetectedCharset();
    detector.reset();
    if (encoding == null) {
        encoding = DEFAULT_ENCODING;
    }
    return encoding;
}

上面的代码已经过测试,可以按预期工作。只需将 juniversalchardet-1.0.3.jar 添加到类路径中即可。

我已经测试了juniversalchardetjchardet。我的总体印象是,juniversalchardet提供了两个库的更好的检测准确性和更好的API。


答案 2

还有Apache Tika - 一个内容分析工具包。它可以猜测哑剧类型,也可以猜测编码。通常猜测是正确的,概率非常高。


推荐