Трудности кодирования Cygwin

Не уверен, что это проблема программирования. Я начал подозревать это ... но затем я запустил рассматриваемую Java-программу (исполняемый jar) в консоли Windows вместо Cygwin ... и она работала нормально: выходные акценты в порядке, акцентированный ввод принят нормально. Так что нижеследующее относится только к консоли Cygwin.

Я обрабатываю французский текст. Когда печатаются символы с диакритическими знаками (System.out), вместо них печатается своего рода «заштрихованное поле». Я видел здесь еще один вопрос об этом, но не было дано никакого решения или правильного объяснения.

И когда я ввожу символы с акцентом, они считываются неправильно (Java System.in), например. Затем «bénéfice» распечатывается (в журнале, который правильно обрабатывает кодировку) как «bénéfice».

Что озадачивает (возможно), так это то, что я могу ввести «bénéfice» в консоли. Насколько я понимаю, шрифт Deja Vu Sans Mono предназначен для работы с Unicode. Итак... может это как-то связано с потоками Java System.in и System.out???

Во избежание сомнений, это Cygwin на платформе Windows (кто-нибудь использует Cygwin на ОС, отличной от Windows?).

Я попытался изменить «Язык», «Набор символов» и «Шрифт», выбрав «Параметры» -> «Текст». Ничто не меняет эти ящики. На данный момент установлены настройки по умолчанию:
Шрифт: Deja Vu Sans Mono
Регион: en_GB
Набор символов: UTF-8

В командной строке, когда я иду

$ locale

я получил

LANG=en_GB.UTF-8
LC_CTYPE="en_GB.UTF-8"
LC_NUMERIC="en_GB.UTF-8"
LC_TIME="en_GB.UTF-8"
LC_COLLATE="en_GB.UTF-8"
LC_MONETARY="en_GB.UTF-8"
LC_MESSAGES="en_GB.UTF-8"
LC_ALL=

Кто-нибудь знает, что мне делать?


person mike rodent    schedule 30.01.2017    source источник
comment
Cygwin, конечно, только для Windows. Обратите внимание, что Java не является приложением cygwin, поэтому оно, скорее всего, будет игнорировать настройку локали cygwin.   -  person matzeri    schedule 30.01.2017
comment
Спасибо. Итак... на практике, что это может означать с точки зрения байтов и кодировок и возможного решения? Есть ли способ заставить Java отправлять потоки в определенной кодировке? Признаюсь, кодирование всегда меня совершенно сбивало с толку.   -  person mike rodent    schedule 30.01.2017
comment
Скорее всего, это просто несоответствие кодировки, используемой вашим java-экземпляром и консолью cygwin. Возможно, стоит проверить кодировку символов, используемую вашим java-экземпляром. Этот вопрос также может быть весьма полезен в решение этой проблемы.   -  person Paul    schedule 30.01.2017
comment
какой код вы использовали для чтения строки из System.in?   -  person ZhongYu    schedule 31.01.2017
comment
@ Пол отлично! Вы решили половину проблемы: PrintStream out = new PrintStream(System.out, true, "UTF-8");. Теперь я пытаюсь понять, как получить BufferedReader сделать readLine с правильной кодировкой...   -  person mike rodent    schedule 31.01.2017
comment
@ЧжунЮ BufferedReader br = new BufferedReader( new InputStreamReader(System.in) );. Предположительно, это не использует UTF8. Знаете, как я это решаю?   -  person mike rodent    schedule 31.01.2017
comment
UTF-8 для InputStreamReader   -  person ZhongYu    schedule 31.01.2017
comment
Вы должны опубликовать весь код чтения из in, а затем распечатать в out.   -  person ZhongYu    schedule 31.01.2017


Ответы (1)


Спасибо Полу и Чжун Ю за ответы здесь.

Чтобы печатать в Cygwin, сделайте следующее:

PrintStream out = new PrintStream(System.out, true, "UTF-8");
out.print( outputString );

Чтобы прочитать из Cygwin, сделайте следующее:

BufferedReader br = new BufferedReader( new InputStreamReader(System.in, "UTF-8") );
String nextInputLine = br.readLine();

Слегка удивлен, что этот вопрос не возник перед Cygwin.

person mike rodent    schedule 30.01.2017