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

kno*_*orv 35 java encoding utf-8 character-encoding

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

值得注意:

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

kno*_*orv 33

以下方法使用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;
}
Run Code Online (Sandbox Code Playgroud)

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

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


Tho*_*ler 5

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