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

标签 java unicode compilation

考虑以下场景

例子.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

关于Java - 编译器错误地解析 unicode 源文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32012622/

相关文章:

angular - 在 Angular 4/5 中编译动态 HTML——类似于 Angular JS 中的 $compile

java - Java 中是否有替代 Thread.sleep 的方法

powershell - 在 PowerShell 输出到文件之前修复 ANSI 控制字符

android - 如何使用 HttpPost 发送日语字符

Go rune literal for high positioned emojis

java - 编译引用类构造函数的Maven编译错误

java - 我无法弄清楚如何处理收到的错误。这是我的购物车项目

java - 错误代码 : 1822. 添加外键约束失败。引用表 'employee_ibfk_1' 中缺少约束 'Address' 的索引

java - 我可以在 NetBeansIDE 32 位上运行在 NetBeansIDE 64 位中开发的应用程序吗?

c++ - 未找到符号又名 undefined symbol