You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 10:43:12