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转换为错误的字符串?
问题是编译器采用系统的标准字符集,而UTF-8显然不是系统的标准字符集.
javac直接使用时:
javac -encoding utf8 MySourceFile.java
Run Code Online (Sandbox Code Playgroud)
使用gradle时,您可以使用:
对于所有java编译器任务:
tasks.withType(JavaCompile) {
options.encoding = 'utf8'
}
Run Code Online (Sandbox Code Playgroud)对于单个任务:
compileJava.options.encoding = 'utf8'
Run Code Online (Sandbox Code Playgroud)现在代码将输出:
string constant: ÄäÖöÜü
loaded string: ÄäÖöÜü
equal: true
Run Code Online (Sandbox Code Playgroud)