Java: Как я могу получить кодировку от inputStream? - PullRequest
10 голосов
/ 29 ноября 2011

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

1-й способ - использовать InputStreamReader.

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

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

Выход: GBK

2-й способ - использовать UniversalDetector.

Но он всегда возвращает ноль.

    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 ]

6 голосов
/ 29 ноября 2011

Давайте возобновим ситуацию:

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

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

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

0 голосов
/ 29 июля 2016
    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;
}
...