Как читать буквы с акцентом с терминала на Java?JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Как читать буквы с акцентом с терминала на Java?

Сообщение Anonymous »

У меня есть следующий фрагмент Java:

Код: Выделить всё

System.out.print("What is the first name of the Hungarian poet Petőfi? ");
String correctAnswer = "Sándor";
Scanner sc = new Scanner(System.in);
String answer = sc.next();
sc.close();
if (correctAnswer.equals(answer)) {
System.out.println("Correct!");
} else {
System.out.println("The answer (" + answer + ") is incorrect, the correct answer is " + correctAnswer);
}
Это отлично работает в Eclipse, но не работает в терминале Windows: даже если я введу правильный ответ Sándor, сравнение не удастся. Вот как это выглядит в Eclipse:

Код: Выделить всё

What is the first name of the Hungarian poet Petőfi? Sándor
Correct!
То же самое из командной строки:

Код: Выделить всё

What is the first name of the Hungarian poet Petőfi? Sándor
The answer (S?ndor) is incorrect, the correct answer is Sándor
Я безуспешно пробовал следующее:
  • Код: Выделить всё

    CHCP 65001
    (для смены кодовой страницы на UTF-8): это нужно только в том случае, если слово Petőfi отображается неправильно, но не помогает при вводе.
  • Код: Выделить всё

    [Console]::InputEncoding = [Console]::OutputEncoding = New-Object System.Text.UTF8Encoding
  • Передача StandardCharsets.UTF_8 или «UTF-8» в сканер.
  • Использование InputStreamReader (с передачей кодировки или без нее) вместо Scanner.
  • Передача параметра командной строки -Dfile.encoding=UTF-8 .
  • Добавление строки System.setProperty("file.encoding", "UTF-8");
  • Использование PowerShell вместо cmd
Перепроверил: кодировка исходного файла Java — UTF-8.
При преобразовании в байты (

Код: Выделить всё

Arrays.toString(input.getBytes())
) Я столкнулся со следующим:
  • По умолчанию буквы без акцентов получают свои обычные коды ASCII. Акцентированные буквы имеют длину 3 байта, все отрицательные значения. До изменения кодовой страницы байты Шандора таковы: [83, -17, -65, -67, 110, 100, 111, 114].
  • Когда код страница изменяется на UTF-8, тогда буквы без акцента остаются прежними, а все буквы с акцентом становятся одним символом длиной 0. После изменения кодовой страницы байты выглядят так: [83, 0, 110, 100, 111, 114 ].
  • То же самое в Eclipse: [83, -61, -95, 110, 100, 111, 114]
  • Строка Sándor на самом деле кодируется в Java следующим образом: [83, -61, -95, 110, 100, 111, 114]

    Итак, чтобы сузить список до буквы á, у нас есть следующее:
  • Java кодирует ее как C3 A1 , что означает «латинская строчная буква A с острым» согласно https://www.charset.org/utf-8.
  • После ввода это кодируется как EF BF BD , который является «Символом замены» согласно https://www.charset.org/utf-8/66.
  • После CHCP 65001 измените его. кодируется как 0.
В Git Bash работает, но буква ő (и все остальные символы с диакритическими знаками, а не только этот) отображается неправильно в этом терминале:

Код: Выделить всё

What is the first name of the Hungarian poet Pet▒fi? Sándor
Correct!
Странно, что даже сравнение работает, и ввод акцентированных символов выглядит нормально, повторное отображение одного и того же не работает:

Код: Выделить всё

What is the first name of the Hungarian poet Pet▒fi? Péter
The answer (P▒ter) is incorrect, the correct answer is S▒ndor
В терминале Windows помогло следующее:

Код: Выделить всё

Console console = System.console();
String answer = console.readLine();
Но это не работает в Eclipse:

Код: Выделить всё

What is the first name of the Hungarian poet Petőfi? Sándor
The answer (Sándor) is incorrect, the correct answer is Sándor
ОБНОВЛЕНИЕ: похоже, это зависит от настроек системы. У меня есть 2 ноутбука: один с венгерскими настройками, другой с английскими.
  • Венгерский работает с System.console() в терминале, и новый Scanner(System.in) работает в Eclipse. Однако в Eclipse это работает некорректно, даже если я меняю кодировку в Window -> Preferences -> General -> Workspace.
  • В английской версии я не нашел ни одной рабочей опции в терминале : либо вывод (например, буква ő) неверен, либо сравнение не выполнено. И при попытке использовать подход System.console() он выдает NullPointerException, являющийся нулевым значением консоли. (Эта версия Eclipse — 2023-12; я не пробовал там последнюю версию.)
Моя версия Java — 22.0.2, но проблема возникает похоже, не зависит от версии.
В качестве перекрестной проверки я попробовал то же самое в Python, и он без проблем работает как в терминале Windows, так и в IDE:

Код: Выделить всё

answer = input('What is the first name of the Hungarian poet Petőfi? ')
correct_answer = 'Sándor'
if answer == correct_answer:
print('Correct')
else:
print('The answer (' + answer + ') is incorrect, the correct answer is ' + correct_answer)
Итак, мой вопрос: как заставить это работать? Существует ли универсальное решение, которое работает как в терминале Windows, так и в Eclipse?

Подробнее здесь: https://stackoverflow.com/questions/791 ... al-in-java
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как читать буквы с акцентом с терминала на Java?
    Anonymous » » в форуме JAVA
    0 Ответы
    9 Просмотры
    Последнее сообщение Anonymous
  • Как читать буквы с акцентом с терминала на Java?
    Anonymous » » в форуме JAVA
    0 Ответы
    8 Просмотры
    Последнее сообщение Anonymous
  • Как читать буквы с акцентом с терминала на Java?
    Anonymous » » в форуме JAVA
    0 Ответы
    6 Просмотры
    Последнее сообщение Anonymous
  • Как читать буквы с акцентом с терминала на Java?
    Anonymous » » в форуме JAVA
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous
  • Как читать буквы с акцентом с терминала на Java?
    Anonymous » » в форуме JAVA
    0 Ответы
    6 Просмотры
    Последнее сообщение Anonymous

Вернуться в «JAVA»