Подтвердить что ты не робот

Java, Unicode, UTF-8 и Windows Command Prompt

У меня есть файл jar, который должен читать кодированный файл UTF-8, который я написал в текстовом редакторе под Windows, и отображать символы на экране. В OS X и Linux это работает безупречно. У меня есть немного проблем с тем, чтобы заставить его работать под Windows, хотя... Я определил читателя и писателя так:

FileInputStream file = new FileInputStream(args[0]);
InputStreamReader reader = new InputStreamReader(file, "UTF8");

PrintStream writer = new PrintStream(System.out, true, "UTF8");

Я также изменил шрифт командной строки на Lucida Console и кодировку символов на UTF-8 с помощью chcp 65001 в этом порядке.

Теперь, когда я запускаю java -jar Read.jar file.txt, приглашение отключает это.

áéí
ñóú
[]óú
[]

Однако, если я запустил type file.txt, подсказка корректно отобразит содержимое файла.

áéí
ñóú

Я попытался сохранить мой файл с и без спецификации, но это не изменило ситуацию. (UTF-8 даже не нуждается в спецификации, потому что у нее нет верности?) Я пробовал компилировать с помощью javac -encoding utf8 *.java, но то же самое происходит.

Теперь у меня нет идей. Кто-нибудь хочет помочь?

4b9b3361

Ответ 1

Кодовая страница 65001 не работает. Функции stdio runtime MS C возвращают неточное количество байтов, считанных и написанных при работе под 65001, что приводит к странным поведением, подобным этому.

Он не может быть исправлен - вы не можете надежно использовать консоль Windows для ввода/вывода Unicode из приложений, использующих функции байтов ввода-вывода C stdlib (включая Java). Вы можете взломать его, вызвав функцию Win32 API WriteConsoleW, чтобы получить содержимое Unicode непосредственно на консоли, но тогда вам нужно беспокоиться о том, чтобы определить, когда stdout на самом деле является консолью (не перенаправляется в файл).

Это давний источник горя, который MS не интересует фиксацией.

Ответ 2

По-видимому, это могут быть символы новой строки. Когда я делаю символы новой строки на стандартном английском языке ISO-8859-1, я использую массив char [], потому что символы Windows '\ r' и '\n' и UNIX/Linux являются только символами новой строки. Выиграйте 4 байта, unix 2 байта. Нет, в документах API для классов символьных конвертеров система преобразования кодировки может иметь ложные байты, оставшиеся для того, чтобы отбросить зависимость от кодировок и требований к размеру символов.

Ответ 3

Попробуйте использовать BufferReader для чтения вашего файла следующим образом:

   BufferedReader in = new BufferedReader(
       new InputStreamReader(
                  new FileInputStream(file), "UTF8"));