CentOS服务器下Java 2D drawString中文字符显示方框问题
解决CentOS下Java 2D drawString中文字符显示方框问题
嘿,咱们来搞定CentOS上Java 2D的drawString方法把中文字符显示成方框(俗称“豆腐块”)的问题。从你贴的fc-list输出来看,系统里确实装了文泉驿等宽微米黑,但Java的字体渲染逻辑没正确关联到中文字体,导致中文字符没法正常渲染。下面是一步步的排查和解决办法:
1. 补装更通用的中文字体(可选但推荐)
CentOS默认的中文字体包可能不够全,先装几个常用的中文字体,确保有足够的 fallback 选项:
- 安装文泉驿微米黑(确保是完整版本):
yum install wqy-microhei-fonts -y - 如果需要更通用的宋体(很多Java程序默认优先找这个),可以装:
yum install cjkuni-ukai-fonts -y
装完后刷新系统字体缓存:
fc-cache -fv
2. 在代码里直接指定中文字体(最快见效)
最直接的办法是在调用drawString前,明确指定系统中已有的中文字体,让Java不用猜该用什么字体:
// 用你系统里已有的文泉驿等宽微米黑 Font chineseFont = new Font("WenQuanYi Micro Hei Mono", Font.PLAIN, 14); // 如果装了宋体,也可以用这个:Font chineseFont = new Font("SimSun", Font.PLAIN, 14); // 把字体设置到Graphics对象上 graphics.setFont(chineseFont); graphics.drawString("测试中文显示", 20, 20);
这样Java会直接用指定的中文字体渲染,不会再出现方框。
3. 全局配置Java字体 fallback(不用改代码)
如果不想修改代码,可以调整Java的字体配置,让它默认把中文字体加入 fallback 列表:
- 找到Java安装目录下的
jre/lib/fontconfig.properties(比如OpenJDK的路径可能是/usr/lib/jvm/java-1.8.0-openjdk/jre/lib/fontconfig.properties) - 打开文件,找到
sequence.allfonts这一行,在末尾添加中文字体的家族名,比如:
(注意保留原有内容,只把中文字体加在最后)sequence.allfonts=... WenQuanYi Micro Hei Mono, SimSun - 保存后重启你的Java应用,配置就会生效。
4. 验证Java是否识别到中文字体
可以写个小工具类,列出Java能识别的所有字体,确认中文字体在列表里:
import java.awt.Font; import java.awt.GraphicsEnvironment; public class ListJavaFonts { public static void main(String[] args) { GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); for (Font font : ge.getAllFonts()) { System.out.println("可用字体:" + font.getFamily()); } } }
编译运行后,看看输出里有没有WenQuanYi Micro Hei Mono或者SimSun,有的话说明Java已经能找到中文字体了。
5. 检查Java渲染依赖库
CentOS上的OpenJDK需要依赖fontconfig和libXrender来正常渲染字体,确保这些库已经安装:
yum install fontconfig libXrender -y
装完后重启Java应用,避免依赖缺失导致的字体渲染问题。
内容的提问来源于stack exchange,提问作者Jenkamen
相关产品推荐
相关产品推荐

