为何Gradle守护进程中System.out.charset()与stdout.encoding不相等?
问题分析与解决
核心原因
Gradle 8.x 默认会强制将 System.out 的编码设置为 UTF-8,无论控制台当前的代码页是什么。这就是你修改控制台编码为1252后,stdout.encoding 显示1252,但 System.out.charset() 返回UTF-8的原因——Gradle启动后覆盖了标准输出流的编码配置。而直接用java命令运行类时,Java会直接继承控制台的编码,所以两者保持一致。
解决方案
要让 System.out.charset() 与 stdout.encoding 一致,有两种可行方式:
1. 全局配置Gradle JVM参数
在用户目录下的 ~/.gradle/gradle.properties(或项目根目录的gradle.properties)中添加以下配置,明确指定输出编码为控制台当前的1252:
org.gradle.jvmargs=-Dstdout.encoding=CP1252 -Dstderr.encoding=CP1252
这样Gradle守护进程启动时会直接使用指定的编码,且不会强制覆盖为UTF-8。
2. 在项目构建脚本中手动修正输出流编码
如果只需要针对当前项目生效,可以在build.gradle中添加以下代码,将System.out的编码强制对齐stdout.encoding的值:
// 针对所有Java执行任务生效 tasks.withType(JavaExec) { doFirst { String targetEncoding = System.getProperty('stdout.encoding') System.out = new PrintStream(System.out, true, targetEncoding) } } // 如果是在构建脚本中直接输出(比如println),也需要手动设置 def targetEncoding = System.getProperty('stdout.encoding') System.out = new PrintStream(System.out, true, targetEncoding)
验证方法
修改后重新运行构建脚本,输出System.out.charset()和System.getProperty("stdout.encoding"),两者应该都会返回windows-1252(或CP1252),与控制台编码一致。
内容的提问来源于stack exchange,提问作者ok im
相关产品推荐
相关产品推荐

