Java:我如何从inputStream获取编码?

you*_*ang 10 java io encoding

我想从流中获取编码.

第一种方法 - 使用InputStreamReader.

但它总是返回OS编码.

InputStreamReader reader = new InputStreamReader(new FileInputStream("aa.rar"));
System.out.println(reader.getEncoding());
Run Code Online (Sandbox Code Playgroud)

输出: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();
Run Code Online (Sandbox Code Playgroud)

输出:空

我怎样才能做对的?:(

Joo*_*gen 6

让我们恢复这种情况:

  • InputStream传递字节
  • *读者以某种编码方式提供字符
  • new InputStreamReader(inputStream)使用操作系统编码
  • new InputStreamReader(inputStream,"UTF-8")使用给定的编码(这里是UTF-8)

因此,在阅读之前需要知道编码.你首先使用charset检测类做了一切.

阅读http://code.google.com/p/juniversalchardet/它应该处理UTF-8和UTF-16.您可以使用编辑器JEdit来验证编码,并查看是否存在某些问题.