java编译含中文源码时需用javac -encoding 编码名 文件名显式指定源文件编码(如utf-8、gbk),且-encoding必须位于.java文件名之前;运行java命令无需该参数,乱码问题应从终端编码、jvm参数-dfile.encoding或代码显式指定字符集排查。

在 Java 命令行中编译源文件时,如果源码含中文或其他非 ASCII 字符,而系统默认编码(如 Windows 的 GBK、Linux/macOS 的 UTF-8)与源文件实际编码不一致,就会报错“非法字符”或“未结束的字符串字面量”。此时必须用 -encoding 参数显式指定源文件的字符编码。
编译时用 -encoding 指定源文件编码
语法很简单,在 javac 命令后紧跟 -encoding 选项和编码名:
javac -encoding UTF-8 Hello.javajavac -encoding GBK Main.javajavac -encoding ISO-8859-1 Util.java
注意:-encoding 必须写在 .java 文件名之前,否则会被忽略。编码名不区分大小写,但推荐用标准写法(如 UTF-8、GBK),避免用 utf8 或 gb2312 等非标准形式(部分 JDK 版本可能不识别)。
运行时不需要指定编码参数
java 命令本身没有 -encoding 选项——它运行的是已编译好的 .class 字节码,不涉及源码读取。如果程序运行时出现乱码(比如控制台输出中文为问号),问题通常出在:
- 终端/命令行窗口的默认编码与程序输出编码不匹配(例如 Windows CMD 默认 GBK,但程序按 UTF-8 输出)
- JVM 启动参数未设置控制台编码(可通过
-Dfile.encoding=UTF-8统一内部编码) - 代码中未显式指定字符集(如
new String(bytes)未传 charset,依赖平台默认值)
常见编码与适用场景
多数现代项目推荐统一使用 UTF-8:
- UTF-8:跨平台兼容最好,支持所有 Unicode 字符,建议新建项目默认使用
- GBK / GB2312:Windows 中文系统传统编码,打开旧项目或遗留 .java 文件时可能需要
- ISO-8859-1:仅支持西欧字符,极少用于含中文的 Java 源码,但某些 HTTP 场景会遇到
可用 javac -help 查看当前 JDK 支持的编码列表,或通过 java -XshowSettings:properties -version 2>&1 | grep file.encoding 查看 JVM 默认编码。
IDE 和构建工具中的对应设置
虽然命令行用 -encoding 即可,但实际开发中更推荐在 IDE 或构建工具里统一配置,避免每次手动输入:
- IntelliJ IDEA:File → Settings → Editor → File Encodings → Project Encoding
- Eclipse:右键项目 → Properties → Resource → Text file encoding
- Maven:在
pom.xml中配置<project.build.sourceencoding>UTF-8</project.build.sourceencoding> - Gradle:在
build.gradle中添加compileJava.options.encoding = "UTF-8"
这些设置最终都会传递给 javac,效果等同于命令行加 -encoding。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











