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

Spring Boot日志UTF-8编码异常问题求助

解决Java日志输出UTF-8字符乱码问题

问题描述

定义字符串String name = "Marco Nuñez",通过LOGGER.debug输出时显示为NU�EZ。已尝试以下操作但未解决:

  • 在pom.xml中设置<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>等编码属性
  • 将IntelliJ项目编码改为UTF-8
  • 用命令mvn spring-boot:run -Drun.jvmArguments="-Dfile.encoding=UTF-8"启动项目

测试代码LOGGER.debug("JAIRO RAFAEL NUÑEZ ALEMAN")输出仍乱码。mvn -verbose显示平台编码为UTF-8,但通过LOGGER.debug("My project encoding is : "+ Charset.defaultCharset());得到默认编码为windows-1252。仅通过System.setOut(new PrintStream(new FileOutputStream(FileDescriptor.out), true, StandardCharsets.UTF_8));可使控制台输出正常,需彻底解决项目及字符串的UTF-8编码问题。

解决方案

1. 强制JVM启动参数指定UTF-8编码

确保JVM启动时同时设置文件编码和系统编码参数,避免环境覆盖:

  • IntelliJ启动配置:打开Run/Debug Configurations,在VM options中添加-Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8
  • Maven启动命令:使用mvn spring-boot:run -Dspring-boot.run.jvmArguments="-Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8"(Spring Boot 2.x+推荐用spring-boot.run.jvmArguments)

2. 配置日志框架输出编码(关键)

乱码常出现在日志框架层面,需为控制台输出指定UTF-8编码:

  • Logback配置(logback.xml/logback-spring.xml):
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <charset>UTF-8</charset>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
    
  • Log4j2配置(log4j2.xml):
    <Console name="Console" target="SYSTEM_OUT">
        <PatternLayout charset="UTF-8" pattern="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"/>
    </Console>
    

3. 确认IDE控制台编码

IntelliJ中除项目编码外,需单独设置控制台编码:
打开File > Settings > Editor > General > Console,将Console Encoding设置为UTF-8。

4. 完善Maven编译编码配置

在pom.xml中补充完整编码属性,确保编译、报告全流程用UTF-8:

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <maven.compiler.encoding>UTF-8</maven.compiler.encoding>
</properties>

5. 外部资源读取指定编码

如果字符串来自配置文件或外部文件,读取时显式指定UTF-8:

try (InputStreamReader reader = new InputStreamReader(new FileInputStream("config.properties"), StandardCharsets.UTF_8)) {
    // 执行读取逻辑
}

内容的提问来源于stack exchange,提问作者Michael Adolfo Huerta Ramirez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 15:07:36