Java Unicode问题(我认为)

时间:2012-01-31 19:11:54

标签: java unicode java.util.scanner

我是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() + ")");
            }
        }
    }
}

文本文件的内容,我的文件名是我传入args [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)

如您所见,Java中将非标准字符视为3个字符的字符串。奇怪的是,如果我将终端输出中的一个字符复制/粘贴到System.out.println("└".length())语句中,它会正确打印1

关于我哪里出错的任何想法?
感谢

2 个答案:

答案 0 :(得分:8)

使用Java打开文件时,编码(如果未指定编码)取自file.encoding系统属性。这几乎从未设置为你想要的东西(如果你像我一样,你总是想要UTF-8)。

要修复,请在创建扫描程序时明确指定字符集:

Scanner scanner = new Scanner(new File(args[0]), "UTF-8");

答案 1 :(得分:0)

我怀疑你的问题确实来自编码不匹配。 您是否尝试过在扫描程序的构造函数中传递Charset?

您的代码在我的系统(Arch Linux 64b,java 6.0.30)上运行良好,默认语言环境为UTF-8。如果运行Windows,则您的语言环境可能是Win-CP1252,可供扫描程序使用。