我想从流中获取编码。
第一种方法 - 使用 InputStreamReader。
但它总是返回操作系统编码。
InputStreamReader reader = new InputStreamReader(new FileInputStream("aa.rar"));
System.out.println(reader.getEncoding());
output:GBK
第二种方法 - 使用 UniversalDetector。
但它总是返回 null。
FileInputStream input = new FileInputStream("aa.rar");
UniversalDetector detector = new UniversalDetector(null);
byte[] buf = new byte[4096];
int nread;
while ((nread = input.read(buf)) > 0 && !detector.isDone()) {
detector.handleData(buf, 0, nread);
}
// (3)
detector.dataEnd();
// (4)
String encoding = detector.getDetectedCharset();
if (encoding != null) {
System.out.println("Detected encoding = " + encoding);
} else {
System.out.println("No encoding detected.");
}
// (5)
detector.reset();
output:null
我怎样才能得到正确的答案? :(
最佳答案
让我们恢复一下情况:
- InputStream 传递字节
- *阅读器以某种编码传递字符
- new InputStreamReader(inputStream) 使用操作系统编码
- new InputStreamReader(inputStream, "UTF-8") 使用给定的编码(此处为 UTF-8)
所以在阅读之前需要知道编码。您首先使用字符集检测类做了所有正确的事情。
阅读http://code.google.com/p/juniversalchardet/它应该处理 UTF-8 和 UTF-16。 您可以使用编辑器JEdit来验证一下编码,看看是否有问题。
关于Java:如何从inputStream获取编码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57708510/