chi*_*ley 1 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() + ")");
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
以及我传入args [0]进行测试的文件名的文本文件的内容:
command1
x
y
command2
z
?
command1
?
?
Run Code Online (Sandbox Code Playgroud)
预期产出是:
command: command1
character: x
character: y
command: command2
character: z
character: ?
command: command1
character: ?
character: ?
Run Code Online (Sandbox Code Playgroud)
实际输出是:
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)
Run Code Online (Sandbox Code Playgroud)
如您所见,Java中将非标准字符视为3个字符的字符串.奇怪的是,如果我将终端输出中的一个字符复制/粘贴到一个System.out.println("?".length())语句中,它就会正确打印1.
关于我哪里出错的任何想法?
谢谢
使用Java打开文件时,编码(如果未指定编码)将从file.encoding系统属性中获取.这几乎从未设置为你想要的东西(如果你像我一样,你总是想要UTF-8).
要修复,请在创建扫描程序时明确指定字符集:
Scanner scanner = new Scanner(new File(args[0]), "UTF-8");
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3438 次 |
| 最近记录: |