Японские символы и строки читаются со сканера/консоли

Мне было интересно, могу ли я распечатать строку с японскими символами. Я остановил мини-проект, который был, во-первых, из моей лиги. Но по мере улучшения моих навыков и любопытства на языках высокого уровня я наткнулся на свой старый проект. Но даже с перерывами от кодирования я все еще думал, возможно ли это. Это не мой проект ничьей (на самом деле, если приведенный пример не применим к программированию, я буду чувствовать себя глупо для простой попытки.)

public static void main(String[] args) {
 // TODO code application logic here
 //Example:
 System.out.println("Input English String Here... ");
 Scanner english = new Scanner(System.in);
 String English = english.next();
 System.out.println("今、漢字に入ります。 ");
 Scanner japanese = new Scanner(System.in);
 String Japanese = japanese.next();
 System.out.println("Did it work...? ");
 System.out.println(English);
 System.out.println(Japanese);
}

бег:

Input English String Here...
Good
今、漢字に入ります。
いい
Did it work...? 
Good
??

Я ожидаю увидеть いい на последней строке вывода.

3 ответа

Наиболее вероятное объяснение для получения ?? вместо いい является несоответствие между кодировкой символов, которая доставляется вашей системой ввода компьютера, и кодировкой символов Java по умолчанию, определенной JVM.

Предполагая, что вход кодируется UTF-8, более надежным способом настройки сканера является new Scanner(System.in, "UTF-8").

Также обратите внимание, что нет необходимости создавать несколько объектов сканера. Вы можете... и должны... создать и повторно использовать его. Вероятно, не имеет значения, действительно ли вход действительно интерактивен, но если есть вероятность, что ввод может быть передан в программу, вы можете обнаружить, что первый Scanner забирает вход, который должен перейти во второй Scanner.


Если вы используете eclipse вы можете изменить кодировку символов по умолчанию в run->run configurations → common.

Также было бы лучше использовать Scanner(System.in,StandardCharsets.UTF_8.displayName()) вместо жесткого кодирования строкового значения.

Вот ссылка на другую тему об изменении кодировки по умолчанию для сетевых бобах: как изменить кодировку файлов в NetBeans?


Поддержка японского шрифта является пятнистым и отличается между компонентами AWT и Swing. Эти смешные blobs, вероятно, означают, что вы используете комбинацию шрифтов/компонентов, в которой нет японских глифов.

Другая возможность заключается в том, что вы манипулировали символами строки, передавая их через массивы или целые байты, легко случайно потерять биты старшего порядка. Из-за этой опасности существует несколько устаревших API.

licensed under cc by-sa 3.0 with attribution.