在 CentOS 上解决 Java 乱码问题,通常是因为 系统字符集、Java 默认编码、文件编码、终端编码 不一致导致的。下面按常见场景一步步说明。
locale
正常应该是:
LANG=zh_CN.UTF-8
LC_ALL=zh_CN.UTF-8
sudo localedef -c -f UTF-8 -i zh_CN zh_CN.UTF-8
临时生效:
export LANG=zh_CN.UTF-8
export LC_ALL=zh_CN.UTF-8
永久生效:
sudo vim /etc/locale.conf
内容:
LANG="zh_CN.UTF-8"
然后重启或重新登录。
java -XshowSettings:properties -version 2>&1 | grep encoding
如果显示:
file.encoding = ANSI_X3.4-1968
说明 Java 用的是非 UTF-8,容易乱码。
java -Dfile.encoding=UTF-8 -jar app.jar
如果是 Tomcat:
export JAVA_OPTS="-Dfile.encoding=UTF-8"
file filename.java
iconv -f GBK -t UTF-8 old.java -o new.java
确保终端使用 UTF-8(如 SecureCRT、Xshell、FinalShell)
<encoder>
<pattern>%d %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
vim conf/logging.properties
确保:
java.util.logging.ConsoleHandler.encoding = UTF-8
| 场景 | 解决方式 |
|---|---|
| 中文变 ??? | -Dfile.encoding=UTF-8 |
| 文件读出来乱码 | 文件转 UTF-8 |
| SSH 显示乱码 | 客户端设 UTF-8 |
| Web 页面乱码 | JSP / HTML 设 UTF-8 |
| 数据库乱码 | JDBC 加 ?useUnicode=true&characterEncoding=UTF-8 |
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
如果你能告诉我:
我可以给你 更精准的一行解决方案。