Командная строка 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"));