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