Проблемы с Java Unicode (я думаю) - PullRequest
1 голос
/ 31 января 2012

Я новичок в 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.

Любые идеи о том, где я иду не так?
Спасибо

Ответы [ 2 ]

8 голосов
/ 31 января 2012

Когда вы открываете файлы в Java, кодировка (если вы ее не указали) берется из системного свойства file.encoding.Это почти никогда не соответствует тому, что вы хотите (если вы похожи на меня, вы всегда хотите UTF-8).

Чтобы исправить, явно укажите свой набор символов при создании сканера:

Scanner scanner = new Scanner(new File(args[0]), "UTF-8");
0 голосов
/ 31 января 2012

Я подозреваю, что ваша проблема действительно связана с несовпадением кодировки.Вы пытались передать Charset в конструктор сканера?

Ваш код отлично работает на моей системе (Arch Linux 64b, java 6.0.30) с языком по умолчанию в UTF-8.Если вы работаете в Windows, ваша локаль может быть Win-CP1252, которая может использоваться сканером.

...