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
, но то же самое происходит.
Теперь у меня нет идей. Кто-нибудь хочет помочь?
Ответы
Ответ 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"));