Файл для чтения Java, содержащий японские символы

Я пытаюсь прочитать файл, содержащий некоторые японские символы.

RandomAccessFile file = new RandomAccessFile("japanese.txt", "r");
String line;
while ((line = file.readLine()) != null) {
   System.out.println(line);
}

Он возвращает некоторые искаженные символы вместо японских. Но когда я конвертирую кодировку, она печатает ее правильно.

line = new String(line.getBytes("ISO-8859-1"), "UTF-8");

Что это значит? Является ли текстовый файл кодировкой ISO-8859-1?

$ file -i japanese.txt возвращает следующее:

japanese.txt: text/plain; charset=utf-8

Пожалуйста, объясните, для чего явно требуется, чтобы файл конвертировался из Latin 1 в UTF-8?


person Shashwat Kumar    schedule 10.07.2019    source источник
comment
@RuelosJoel Почему по умолчанию не используется UTF-8?   -  person Shashwat Kumar    schedule 10.07.2019


Ответы (2)


Нет, readString — устаревший метод, еще до кодировок/кодировок и тому подобного. Он превращает каждый байт в char со старшим байтом 0. Байт 0x85 является разделителем строк (EBCDIC NEL), и если бы он был в какой-то многобайтовой последовательности UTF-8, фактическая строка была бы разбита на две строки. Возможны и другие сценарии.

Лучше всего использовать Files. Он имеет newBufferedReader(path, Charset) и фиксированную кодировку по умолчанию UTF-8.

Path path = Paths.get("japanese.txt");
try (BufferedReader file = Files.newBufferedReader(path)) {
    String line;
    while ((line = file.readLine()) != null) {
        System.out.println(line);
    }
}

Теперь вы будете читать правильные строки.

RandomAccessFile в основном предназначен для двоичных данных.

person Joop Eggen    schedule 10.07.2019

Похоже, это ISO, но я бы попробовал прочитать с этой кодировкой и посмотреть, что произойдет.

Поскольку вы не выполняете произвольный доступ, я бы просто создал BufferedReader с правильной кодировкой и использовал это:

String charSetName = // either UTF-8 or iso - try both
FileInputStream is = new FileInputStream(fileName);
InputStreamReader isr = new InputStreamReader(is, Charset.forName(charSetName));
BufferedReader reader = new BufferedReader(isr);

while ((line = reader.readLine()) != null) {
    System.out.println(line);
}
person rghome    schedule 10.07.2019