Ubuntu下Java乱码的根本原因多为系统字符编码与Java程序编码不一致,或系统缺少中文字体导致中文无法正确显示。以下是分步解决方案:
系统字符编码需与Java程序编码一致(推荐UTF-8)。通过以下命令查看当前编码:
locale
若输出中LANG、LC_ALL等变量未设置为UTF-8(如zh_CN.UTF-8),需临时修改:
export LANG=zh_CN.UTF-8
export LC_ALL=zh_CN.UTF-8
永久生效:将上述命令添加到~/.bashrc或~/.profile文件末尾,然后执行source ~/.bashrc使设置生效。
Ubuntu默认不包含中文字体,需手动安装。常用中文字体包(如文泉驿微米黑、方正雅黑、宋体)可通过以下命令安装:
sudo apt update
sudo apt install ttf-wqy-microhei ttf-wqy-zenhei ttf-simsun
安装后,字体文件会存放在/usr/share/fonts/truetype/目录下。
为了让Java识别并使用系统中安装的中文字体,需在JDK/JRE的字体配置目录下创建fallback目录,并链接中文字体文件:
cd $JAVA_HOME/jre/lib/fontconfig # $JAVA_HOME为JDK安装路径,如/usr/lib/jvm/java-11-openjdk-amd64
sudo mkdir fallback
sudo ln -s /usr/share/fonts/truetype/wqy/wqy-zenhei.ttc fallback/wqy-zenhei.ttc # 链接文泉驿正黑字体
sudo mkfontscale # 生成字体索引
sudo mkfontdir # 创建字体目录
sudo fc-cache -fv # 刷新字体缓存
此操作会让Java优先使用fallback目录中的字体显示中文。
通过JVM参数-Dfile.encoding强制Java使用UTF-8编码,覆盖默认编码(如GBK):
java -Dfile.encoding=UTF-8 -jar yourapp.jar
若使用Tomcat等服务器,可在catalina.sh(Tomcat启动脚本)中添加:
JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=UTF-8"
确保服务器启动时加载该参数。
在读取/写入文件或网络流时,显式指定编码(推荐UTF-8),避免依赖系统默认编码:
// 读取文件(指定UTF-8编码)
try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("input.txt"), "UTF-8"))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
// 写入文件(指定UTF-8编码)
try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("output.txt"), "UTF-8"))) {
writer.write("中文内容");
} catch (IOException e) {
e.printStackTrace();
}
此方法能彻底解决文件操作中的乱码问题。
若使用Eclipse、IntelliJ IDEA等IDE,需确保IDE的编码设置与系统一致:
Window → Preferences → General → Workspace,将“Text file encoding”设置为UTF-8。File → Settings → Editor → File Encodings,将“Global Encoding”和“Project Encoding”设置为UTF-8,并勾选“Transparent native-to-ascii conversion”。若Java程序运行在Tomcat上,需修改server.xml中的Connector配置,指定URI编码为UTF-8:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
URIEncoding="UTF-8" /> <!-- 关键配置 -->
此外,在web.xml中添加字符编码过滤器,确保请求/响应的编码一致:
<filter>
<filter-name>setCharacterEncodingFilter</filter-name>
<filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
通过以上步骤,可覆盖Ubuntu下Java乱码的常见场景。若问题仍未解决,建议检查应用程序是否硬编码了编码格式(如new String(bytes, "GBK")),或是否有第三方库覆盖了编码设置。