出于某种原因,被分配了信字符串å通过使用扫描仪类不等于分配的String å用"正常"的方式: 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!!");
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
编译器将显示以下内容:
乐
乐
l├©ķ
如果您的唯一要求是能够在类名所示的任何地方使用UTF-8 UTF8Test,那么您的主要错误是您使用Windows命令控制台来编译和运行Java程序.在?©作为mojibaked的形式,ø即强烈建议您使用CP850编码来编译Java源代码文件.作为证据,在支持UTF-8的环境中运行:
System.out.println(new String("ø".getBytes("UTF-8"), "CP850"));
Run Code Online (Sandbox Code Playgroud)
这打印?©.这反过来强烈暗示您使用Windows命令控制台来编译Java源代码文件,因为这是目前唯一默认使用CP850的常用环境.但是,Windows命令控制台不支持 UTF-8.
当您在文本编辑器中使用UTF-8编码保存(从字符转换为字节)源代码文件时,该ø字符将变为字节0xC3和0xB8(作为证据,请参阅U +中的"UTF-8(十六进制)"条目00F8角色信息).当您运行时javac UTF8Test.java,基本上使用CP850编码读取UTF-8保存的源代码文件(从字节转换为字符).字节0xC3并0xB8在此编码中表示字符?和©(作为证据,请参阅CP850代码页布局).这完全解释了您的初始问题.
没错,您可以javac通过-encoding UTF-8参数指示使用UTF-8读取源代码文件.但是,Windows命令控制台本身并不支持UTF-8风格的输入和输出.当您使用重新编译时-encoding UTF-8,您仍然会获得mojibaked输出,因为命令控制台无法正确表示UTF-8输出.我在这里试过,我得到了学位符号:
løk l°k
如果您打算在任何地方使用UTF-8 并且希望坚持使用Windows命令控制台作为输入/输出环境,则无法解决此问题.基本上,您需要一个支持UTF-8的输入/输出环境.像Eclipse和Netbeans这样的体面IDE就是这样的.或者,如果您打算将其作为支持UTF-8的独立程序运行,那么使用Swing UI应优先于无GUI的控制台程序.