最近因为需要在java应用中合成曲线图,使用了jfreechart库,但是发现图片中的中文全都显示成方块了。
根据网络上的经验,在创建图表之前,先设置主题ChartFactory.setChartTheme(standardChartTheme);
或者设置字体时用setFont(Font font),发现也不能解决问题。
后来意识到是服务器本身缺少中文字体的问题,Linux机器一般都是没有中文字体的,所以在使用java.awt相关类生成图片时,输出的中文很可能显示乱码或者呈方块状。解决方案就是在服务器启动脚本里,加上安装中文字体的步骤:
- 安装字体到系统中。
- 在JRE目录下创建fonts/callback目录。
- 将Linux系统的字体目录作为JRE下面的字体目录连接。
对应Docker命令:
# 安装字体
RUN yum -y install wqy-microhei-fonts wqy-zenhei-fonts
RUN mkdir -p /opt/xxx/java/jre/lib/fonts/fallback
RUN ln -s /usr/share/fonts /opt/xxx/java/jre/lib/fonts/fallback
这里可以选择任意开源中文字体,我用了文泉译测试。
验证:
- 在改动之前先登录机器,进入目录/usr/share/fonts,可以看到下面只有dejavu字体库。
- 在docker脚本中添加上述命令后,重新部署到服务器上,该目录下多了字体库wqy-microhei 和 wqy-zenhei。
- 这时再触发生成图片的服务,中文正常显示。