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
相关产品推荐
相关产品推荐

