java在windows下需统一编译(-encoding utf-8)、jvm运行(-dfile.encoding=utf-8)和终端编码(chcp 65001),三者缺一不可,否则中文注释、字符串或输出将乱码。

Java编译时指定UTF-8编码,否则javac默认用系统编码(Windows是GBK)
Windows下不显式指定,javac会按GBK读源码,遇到中文注释或字符串字面量就报error: unmappable character或生成错误的class字节码。IDE里改了项目编码,命令行编译照样乱——因为javac根本不看IDE配置。
实操建议:
- 命令行编译必须加
-encoding UTF-8:比如javac -encoding UTF-8 Main.java - Maven项目在
pom.xml里配maven-compiler-plugin的encoding参数,值设为UTF-8 - Gradle项目在
build.gradle里加compileJava.options.encoding = "UTF-8"
运行时JVM也要认UTF-8,不然System.out.println("中文")在cmd里还是问号
编译对了,运行时JVM默认用控制台编码(Windows cmd是GBK),PrintStream写到stdout时会按GBK转义,中文直接变??。这不是程序bug,是JVM输出流和终端编码不匹配。
实操建议:
- 运行时加JVM参数:
-Dfile.encoding=UTF-8,例如java -Dfile.encoding=UTF-8 Main - 注意:
-Dfile.encoding影响整个JVM的默认字符集,包括new String(byte[])、Files.readString()等,别在混合编码的老系统里盲目加 - 如果只针对控制台输出,可手动包装
System.out为PrintStream并指定Charset.forName("UTF-8"),但治标不治本
IDEA/Eclipse的File Encoding设置只是编辑器行为,不影响javac和java进程
很多人在IDE里把文件编码设成UTF-8、把全局编码设成UTF-8,一跑命令行还是乱码——因为IDE的设置只管打开/保存文件时怎么解析字节,不管编译器和JVM怎么干活。
实操建议:
- IDEA:除了
Settings > Editor > File Encodings,还要检查Build > Compiler > Java Compiler里的Target bytecode version旁有没有勾选Use compiler encoding(新版默认关,得手动开) - Eclipse:在
Preferences > General > Workspace设Text file encoding,同时在Java > Compiler > Building里确认UTF-8被用于“Generated class files and metadata” - 关键点:IDE的Maven/Gradle运行配置里,要单独勾选“Override JAVA_TOOL_OPTIONS”或显式传入
-Dfile.encoding=UTF-8,否则它起的JVM还是用系统默认
Windows Terminal或ConEmu比原生cmd更可靠,但根本解法是统一chcp 65001 + JVM参数
即使JVM用了-Dfile.encoding=UTF-8,原生cmd默认代码页是936(GBK),无法正确渲染UTF-8字节流,表现为中文显示为空格、方块或错位。有人换PowerShell,结果发现默认也不支持UTF-8输出——除非手动改注册表或调用chcp 65001。
实操建议:
- 临时生效:运行
chcp 65001再执行java -Dfile.encoding=UTF-8 ... - 永久生效(谨慎):修改注册表
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor\AutoRun,添加chcp 65001 >nul;或改cmd.exe属性里的“启动选项”为UTF-8 - 更稳的组合:终端设
chcp 65001+ JVM加-Dfile.encoding=UTF-8+ 编译加-encoding UTF-8,三者缺一不可
最容易被忽略的是:Maven子模块可能继承父POM但没覆盖编码配置,或者CI脚本里漏了JVM参数。Windows环境下的编码问题从来不是单点故障,而是三个环节(编辑、编译、运行)的编码链断了一环就全崩。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











