Java Strings中的字符"æ","ø""æ"(Windows)

Sin*_*bar 15 java utf-8

出于某种原因,被分配了信字符串å通过使用扫描仪类不等于分配的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├©ķ

Bal*_*usC 7

如果您的唯一要求是能够在类名所示的任何地方使用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编码保存(从字符转换为字节)源代码文件时,该ø字符将变为字节0xC30xB8(作为证据,请参阅U +中的"UTF-8(十六进制)"条目00F8角色信息).当您运行时javac UTF8Test.java,基本上使用CP850编码读取UTF-8保存的源代码文件(从字节转换为字符).字节0xC30xB8在此编码中表示字符?©(作为证据,请参阅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的控制台程序.