根本原因是源文件编码与javac默认读取编码不一致;解决方法是显式使用javac -encoding UTF-8(或GBK等)指定源文件真实编码,并确保UTF-8文件无BOM。

用 javac 编译 Java 源文件时出现中文乱码(比如报错“非法字符”或中文注释/字符串显示为问号),通常是因为源文件的编码(如 UTF-8)与 javac 默认使用的平台编码(如 Windows 的 GBK)不一致。解决方法是**显式通过 -encoding 参数指定源文件的真实编码**。
确认源文件的实际编码
编译前必须知道你的 .java 文件保存时用的是什么编码,常见情况:
- 多数现代编辑器(IntelliJ IDEA、VS Code、Sublime Text)默认保存为 UTF-8(无 BOM)
- Windows 自带记事本保存为 GBK(ANSI) 或 UTF-8(带 BOM,javac 不识别 BOM)
- 可通过编辑器底部状态栏查看,或用命令行工具(如
file -i HelloWorld.java在 Linux/macOS,或用 VS Code 的右下角编码切换按钮)确认
使用 -encoding 参数编译
语法格式:
javac -encoding <编码名> *.java
立即学习“Java免费学习笔记(深入)”;
常用编码名(大小写不敏感):
-
UTF-8:适用于绝大多数 UTF-8 编码的源文件 -
GBK或GB2312:适用于 Windows 记事本直接保存的中文文件 -
ISO-8859-1:较少见,用于某些旧系统
✅ 正确示例:
javac -encoding UTF-8 HelloWorld.java
javac -encoding GBK Main.java Util.java
避免常见坑
-
不要加 BOM:UTF-8 文件若含 BOM(字节序标记),
javac可能报错“类名错误”或“非法字符”,建议用编辑器另存为“UTF-8 无 BOM” -
编码名要准确:写成
utf8或utf_8会报错,必须是UTF-8(标准名称) -
只影响源文件读取:
-encoding仅告诉 javac “怎么读源码”,不影响 class 文件编码或运行时字符串编码 -
IDE 用户注意:IDE(如 IntelliJ)有自己的编码设置,可能自动加
-encoding,但命令行编译仍需手动指定
验证是否生效
编译成功且运行后中文输出正常,说明编码指定正确。可加个简单测试:
public class Test { public static void main(String[] args) { System.out.println("你好"); } }
若 javac -encoding UTF-8 Test.java 成功,且 java Test 输出“你好”,即解决。



















