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

Maven项目UTF-8编码异常:同代码输出结果不一致问题问询

解决Maven项目中土耳其字符输出乱码的问题

这个问题的核心在于代码依赖了系统默认字符集,以及Maven项目和非Maven项目在运行时的字符集配置差异。让我一步步拆解原因和解决方案:

问题根源分析

你的代码里这段逻辑存在隐性隐患:

String value = new String(myString.getBytes("UTF-8"));
  • myString.getBytes("UTF-8") 是把字符串转换成UTF-8编码的字节数组
  • 但后面的new String(byte[])构造方法没有指定解码用的字符集,会自动使用当前JVM的系统默认字符集来解码字节数组
  • NetBeans的非Maven项目大概率自动配置了JVM使用UTF-8作为默认字符集,所以解码正常;而Maven项目默认没有这个配置,导致用了其他字符集(比如ISO-8859-1)来解码UTF-8字节,最终出现乱码

另外要注意:你在pom.xml里设置的project.build.sourceEncoding只负责编译阶段的源文件编码,和运行时的JVM字符集无关。

解决方案

方案1:修复代码(最推荐,消除对环境的依赖)

直接在new String时指定UTF-8解码,彻底规避默认字符集的影响:

import java.nio.charset.StandardCharsets;

// ...

String myString = "Türkçe Karakter Testi : ğüşiöçĞÜİŞÇÖĞ";
String value = new String(myString.getBytes("UTF-8"), StandardCharsets.UTF_8);
System.out.println(value);

其实这段转换逻辑本身是冗余的(因为myString已经是正确的UTF-8字符串),如果你的实际场景不需要这个转换,直接输出myString也能得到正确结果。

方案2:配置Maven运行时的字符集

如果你不想修改代码,可以通过Maven插件强制设置运行时的编码:
在pom.xml的<build>节点下添加exec-maven-plugin的配置:

<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <version>3.1.0</version>
            <configuration>
                <!-- 指定运行时编码为UTF-8 -->
                <encoding>UTF-8</encoding>
            </configuration>
        </plugin>
    </plugins>
</build>

方案3:给Maven项目添加JVM启动参数

在NetBeans中,右键你的Maven项目 → Properties → Run → 在VM Options里添加:

-Dfile.encoding=UTF-8

这样强制JVM使用UTF-8作为默认字符集,运行时就能正确解码了。

内容的提问来源于stack exchange,提问作者Akın Tekeoğlu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:24:31