【发布时间】:2020-11-11 12:16:54
【问题描述】:
在编译、运行测试或运行主类时,gradle 会使用显式 file.encoding 启动 java,例如:
/usr/bin/java -Dfile.encoding=ISO-8859-1 -Duser.country=GB -Duser.language=en
-Duser.variant -cp … com.foo.MyMainClass
gradle 如何选择这个默认的文件编码(对我来说是 ISO-8859-1)?要切换到 UTF-8,我必须在我的 gradle 构建脚本中添加以下内容:
allprojects {
tasks.withType(JavaCompile) {
options.encoding = 'UTF-8'
}
tasks.withType(Test) {
systemProperty 'file.encoding', 'UTF-8'
}
tasks.withType(JavaExec) {
systemProperty 'file.encoding', 'UTF-8'
}
}
设置-Dfile.encoding=UTF-8。
更新 #1
rzwitserloot 注意到 gradle 很可能使用默认编码,这似乎是正确的。
PrintCharset.java
import java.nio.charset.Charset;
public class PrintCharset {
public static void main(String[] args) {
System.out.println("Default: " + Charset.defaultCharset());
}
}
然后,javac PrintCharset.java && java PrintCharset 打印
Default: ISO-8859-1
有趣的是,从 IntelliJ(没有 gradle)运行会执行:
/usr/bin/java -javaagent:… -Dfile.encoding=UTF-8 -classpath … PrintCharset
当然会打印Default: UTF-8。
更新 #2
出于好奇再深入一点,Linux 上 OpenJDK 中的默认字符集是ultimately determined by nl_langinfo():
printlang.c
#include <langinfo.h>
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
setlocale(LC_ALL, "");
printf("%s\n", nl_langinfo(CODESET));
exit(EXIT_SUCCESS);
}
然后,gcc -o printlang printlang.c && ./printlang 打印出ISO-8859-1。
【问题讨论】:
-
还有一个打开的issue请求
UTF-8作为启动deamon时的默认编码。
标签: java gradle character-encoding system-properties