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

时间:2011-11-29 03:55:49

标签: java encoding io

我想从流中获取编码。

第一种方法 - 使用InputStreamReader。

但它总是返回OS编码。

InputStreamReader reader = new InputStreamReader(new FileInputStream("aa.rar"));
System.out.println(reader.getEncoding());
  

输出: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();
  

输出:空

我怎样才能做到正确? :(

2 个答案:

答案 0 :(得分:6)

让我们恢复情况:

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

所以在阅读之前需要知道编码。你首先使用charset检测课做了一切。

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

答案 1 :(得分:0)

    public String getDecoder(InputStream inputStream) {

    String encoding = null;

    try {
        byte[] buf = new byte[4096];
        UniversalDetector detector = new UniversalDetector(null);
        int nread;

        while ((nread = inputStream.read(buf)) > 0 && !detector.isDone()) {
            detector.handleData(buf, 0, nread);
        }

        detector.dataEnd();
        encoding = detector.getDetectedCharset();
        detector.reset();

        inputStream.close();

    } catch (Exception e) {
    }

    return encoding;
}