Java: Как я могу получить кодировку из inputStream?

Я хочу получить кодировку из потока.

1-й метод - использовать InputStreamReader.

Но он всегда возвращает кодировку ОС.

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();

Выход: нуль

Как я могу получить право?: (

Ответ 1

Позвольте возобновить ситуацию:

  • InputStream предоставляет байты
  • * Читатели доставляют символы в некоторой кодировке
  • new InputStreamReader (inputStream) использует кодировку операционной системы
  • new InputStreamReader (inputStream, "UTF-8" ) использует данную кодировку (здесь UTF-8)

Итак, перед чтением нужно знать кодировку. Вы сделали все правильно, используя сначала класс обнаружения кодировки.

Чтение http://code.google.com/p/juniversalchardet/ должно обрабатывать UTF-8 и UTF-16. Вы можете использовать редактор JEdit для проверки кодировки и посмотреть, есть ли какая-то проблема.

Ответ 2

    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;
}