Командная строка Java, Unicode, UTF-8 и Windows
у меня есть файл jar, который должен читать кодированный файл UTF-8-который я написал в текстовом редакторе под Windows-и отображать символы на экране. Под OS X и Linux это работает безупречно. У меня есть немного проблем с тем, чтобы заставить его работать под окнами... Я определил читателя и писателя так:
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
, приглашение правильно отображает содержимое файла.
áéí
ñóú
Я попытался сохранить свой файл с и без BOM, но это не имеет значения. (UTF-8 даже не нуждается в BOM, потому что это отсутствие endianness, правильно?) Я пробовал компиляцию с javac -encoding utf8 *.java
, но то же самое происходит.
у меня закончились идеи. Кто-нибудь хочет помочь?
3 ответов
кодовая страница 65001 сломан. Функции stdio среды выполнения MS C возвращают неточное количество байтов, прочитанных и записанных при запуске под 65001, что приводит к странному поведению, подобному этому.
Это не исправимо - вы не можете надежно использовать консоль Windows для ввода-вывода Unicode из приложений, которые используют функции байтового ввода-вывода c stdlib (включая Java). Вы можете взломать его, вызвав функцию Win32 API WriteConsoleW, чтобы получить содержимое Unicode непосредственно на консоль, но тогда у вас есть беспокоиться об обнаружении, когда stdout на самом деле является консолью (не перенаправляется в файл).
Это давний источник горя, который MS не проявляет интереса к исправлению.
похоже, это могут быть символы новой строки. Когда я делаю символы новой строки на стандартном английском языке ISO-8859-1, я использую массив char [], потому что символы windows "\r " и "\n " и UNIX/Linux являются только \r в качестве символа новой строки. Выиграйте 4 байта, unix 2 байта. A нет, в документах API для классов преобразователей символов система преобразования кодирования может иметь паразитные байты, оставшиеся, чтобы выбросить зависимые кодировки и требования к размеру символов.
попробуйте использовать BufferReader для чтения вашего файла;
BufferedReader in = new BufferedReader(
new InputStreamReader(
new FileInputStream(file), "UTF8"));