猜测 Java 中表示为 byte[] 的文本的编码
2022-09-01 06:08:04
给定一个表示某些未知编码(通常是 UTF-8 或 ISO-8859-1,但不一定是这样)的文本的字节数组,那么猜测最可能的编码(在 Java 中)的最佳方法是什么?
值得注意的是:
- 没有其他元数据可用。从字面上看,字节数组是唯一可用的输入。
- 检测算法显然不是100%正确的。如果算法在超过80%的情况下是正确的,那就足够好了。
给定一个表示某些未知编码(通常是 UTF-8 或 ISO-8859-1,但不一定是这样)的文本的字节数组,那么猜测最可能的编码(在 Java 中)的最佳方法是什么?
值得注意的是:
以下方法使用 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 添加到类路径中即可。
我已经测试了juniversalchardet和jchardet。我的总体印象是,juniversalchardet提供了两个库的更好的检测准确性和更好的API。