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

考虑以下场景

例子.txt:

ÄäÖöÜü

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();
}

这两个文件都以 UTF-8 编码。

这个输出:

string constant: ÄäÖöÜü
loaded string: ÄäÖöÜü
equal: false

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

最佳答案

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

直接使用javac时:

javac -encoding utf8 MySourceFile.java

在使用gradle时,可以使用:

  • 对于所有 java 编译器任务:

    tasks.withType(JavaCompile) {
        options.encoding = 'utf8'
    }
    
  • 对于单个任务:

    compileJava.options.encoding = 'utf8'
    

现在代码将输出:

string constant: ÄäÖöÜü
loaded string: ÄäÖöÜü
equal: true

https://stackoverflow.com/questions/32012622/

相关文章:

r - 如何在 R 中以固定网格模式绘制 "matrix"

c# - 将浮点指针作为 IntPtr 传递(pinvoke)

asp.net - ResponseMode ="File"不工作

python - Django 休息框架 : How serialize list of list?

c# - 使用 Prism 库将 View 注入(inject) TabControl

docker - 学习 docker 的先决条件

git - 在 git 中恢复大多数前 n 个提交

javascript - 检查字符串的第一个字符是否为数字会报错,表明 charat 不是有效方法

python - 如果在 Python 中出现异常重试

batch-file - 批处理文件中的时间戳未正确更新