问题现象

当使用 java -jar 命令运行 Spring Boot 应用时,控制台输出的中文日志出现乱码:

2025-05-29 15:32:31.725+08:00  INFO 8852 --- [cheduled-task-2] p.points.task.TransferDataMappingTask    : 浼犺緭鏁版嵁鏄犲皠浠诲姟鎵ц瀹屾垚
2025-05-29 15:32:47.442+08:00  INFO 8852 --- [cheduled-task-4] p.p.service.PointsHistorySyncService     : 寮€濮嬪鐞嗗緟鍚屾鐨勭敤鎴风Н鍒?

特点

  • IDE 中运行正常
  • 日志文件中文显示正常
  • 仅控制台输出乱码

常见无效方案

网上流传的这些方法通常无效

# ❌ 单独设置JVM参数
java -Dfile.encoding=UTF-8 -jar app.jar

# ❌ 只修改logback配置
<charset>UTF-8</charset>

# ❌ 只切换控制台编码
chcp 65001

终极解决方案

创建启动脚本 start.bat

@echo off
echo Starting Spring Boot Application...

REM 关键步骤1:切换控制台编码为UTF-8
chcp 65001

REM 关键步骤2:设置Java环境变量
set JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8 -Dconsole.encoding=UTF-8

REM 启动应用
java -jar your-application.jar

pause

原理分析

为什么单独设置无效?

  1. 控制台编码问题:Windows CMD 默认使用 GBK 编码
  2. Java 参数优先级:直接设置的 JVM 参数可能被覆盖
  3. Spring Boot 编码处理:框架内部有自己的编码逻辑

为什么组合方案有效?

  1. chcp 65001:将控制台切换到 UTF-8 模式
  2. JAVA_TOOL_OPTIONS:环境变量方式优先级更高
  3. console.encoding:专门处理控制台输出编码

完整配置

1. 启动脚本(必需)

@echo off
chcp 65001
set JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8 -Dconsole.encoding=UTF-8 -Dsun.stdout.encoding=UTF-8
java -jar app.jar
pause

2. logback.xml(可选优化)

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
            <!-- 不设置charset,让系统自动处理 -->
        </encoder>
    </appender>
    
    <root level="INFO">
        <appender-ref ref="STDOUT" />
    </root>
</configuration>