【发布时间】:2013-11-13 15:16:32
【问题描述】:
由于某种原因,使用 Scanner 类分配字母 å 的字符串不等于使用“正常”方式分配 å 的字符串: String a = "å" - 这是为什么?
import java.util.*;
public class UTF8Test {
public static void main(String [] args) {
String [] Norge = {"løk", "hår", "vår", "sær", "søt"};
Scanner input = new Scanner(System.in);
String test = input.nextLine(); //I enter løk here
System.out.println(test);
System.out.println(Norge[0]);
for(int i = 0; i < Norge.length; i++) {
if(Norge[i].equals(test) ) {
System.out.println("YES!!");
}
}
}
}
编译器会显示这个:
笑
笑
l├©k
【问题讨论】:
-
您究竟在哪里确保来自
System.in的字符是使用UTF-8 输入和解释的?我在代码中的任何地方都没有看到。因此,您的代码假设平台的默认字符集(由Charset.defaultCharset()标识)已经是 UTF-8。这是真的吗? -
@BalusC 我没有确保
System.in中的字符使用 UTF-8 进行解释。我该怎么做? -
另外,你用 3 行说“编译器显示这个”,但你列出的输出似乎与你的代码不匹配。
-
取决于运行时环境。
├©作为ø的 mojibaked 形式表明原始环境使用 CP850 而不是 UTF-8。 CP850 默认用于 Windows 命令控制台。这表明您是在 Windows 命令控制台中运行它,而不是在 Eclipse 等支持 UTF-8 的 IDE 中运行。您应该能够通过打印/检查Charset.defaultCharset()的结果来确认这一点。 -
编译器在运行时/输入/输出期间根本不起任何作用。编译器仅在将
.java文件转换为.class文件时起作用。