Java - 编译器错误地解析unicode源文件

RAn*_*s00 2 java unicode compilation

请考虑以下情形

example.txt文件:

ÄäÖöÜü
Run Code Online (Sandbox Code Playgroud)

Java来源:

try (FileInputStream fileInputStream = new FileInputStream("example.txt");
     InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, StandardCharsets.UTF_8);
     BufferedReader bufferedReader = new BufferedReader(inputStreamReader)) {

    String stringLoadedFromOutside = bufferedReader.readLine();
    String stringConstructedInside = "ÄäÖöÜü";

    System.out.println("string constant: " + stringConstructedInside);
    System.out.println("loaded string: " + stringLoadedFromOutside);
    System.out.println("equal: " + stringConstructedInside.equals(stringLoadedFromOutside));
} catch (IOException e) {
    e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)

两个文件都以UTF-8编码.

这输出:

string constant: ÄäÖöÜü
loaded string: ÄäÖöÜü
equal: false
Run Code Online (Sandbox Code Playgroud)

如何防止编译器将源中的unicode转换为错误的字符串?

RAn*_*s00 8

问题是编译器采用系统的标准字符集,而UTF-8显然不是系统的标准字符集.

javac直接使用时:

javac -encoding utf8 MySourceFile.java
Run Code Online (Sandbox Code Playgroud)

使用gradle时,您可以使用:

现在代码将输出:

string constant: ÄäÖöÜü
loaded string: ÄäÖöÜü
equal: true
Run Code Online (Sandbox Code Playgroud)