Я новичок в Java, так что терпите меня, если я скажу что-нибудь глупое!У меня есть несколько проблем, которые, я думаю, связаны с Unicode.
Я использую Scanner
для чтения токенизированных команд из текстового файла, сохраненного в кодировке UTF-8.По сути, я хочу сначала проверить, что команда не равна «command1» или «command2» (я делаю что-то другое в этих случаях), а затем прочитать символ.Если токен не является одним символом, я выведу сообщение об ошибке.
Вот мой код:
public static void main(String[] args) throws FileNotFoundException {
Scanner scanner = new Scanner(new File(args[0]));
while (scanner.hasNext()) {
String command = scanner.next();
if (command.equals("command1")) {
System.out.println("command: command1");
// do something
} else if (command.equals("command2")) {
System.out.println("command: command2");
// do something
} else {
if (command.length() == 1) {
char c = command.charAt(0);
System.out.println("character: " + c);
// do something with c
} else {
System.err.println("error (string was " + command
+ " with length " + command.length() + ")");
}
}
}
}
И содержимое текстового файла, имя файла которого япередавая аргументы [0] для тестирования:
command1
x
y
command2
z
└
command1
╒
═
Ожидаемый результат:
command: command1
character: x
character: y
command: command2
character: z
character: └
command: command1
character: ╒
character: ═
Фактический результат:
command: command1
character: x
character: y
command: command2
character: z
error (string was └ with length 3)
command: command1
error (string was ╒ with length 3)
error (string was ═ with length 3)
Как видите,нестандартные символы рассматриваются как 3-символьная строка в Java.Странно, если я скопирую / вставлю один из символов из вывода терминала в оператор System.out.println("└".length())
, он правильно напечатает 1
.
Любые идеи о том, где я иду не так?
Спасибо