原创

Linux中ImageIO生成图片中文乱码

温馨提示:
本文最后更新于 2018年04月03日,已超过 2,426 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我

前言

我的工具网站中的在线文字生成图片功能,开发是在Windows系统中进行的,在Windows中一切良好,中英文都能很好的展示,但是在我将程序部署到Linux中后,却出现生成的图片中中文全部乱码(显示成一个个的方框)。

Linux中ImageIO生成图片中文乱码文章的图片

一开始我是怀疑字体编码可能有冲突,通过System.getProperty("file.encoding")查看我本机的编码是GBK,而我服务器(centos7)上的编码是UTF-8。因此,我在生成图片时修改了系统编码,但不管用。

后来在不断google中看有的网友提到“字体”,因为Centos中没有中文字体,所以才造成上图中的一个个方框(一想也对,乱码的话应该是一对不规则的符号,不能是一个个方框)。

找到方法就去干!

查看服务器字体列表

[root@iZ2zez5rp1bmsZ share]# cd fc-list
bash: cd: fc-list: No such file or directory

悲哀,连字体库都没有

安装字体库

# 先安装fontconfig,用fontconfig来安装字体库
[root@iZ2zebjvdi1bmsZ share]# yum -y install fontconfig
Loaded plugins: fastestmirror
...
Installed:
  fontconfig.x86_64 0:2.10.95-10.el7

Dependency Installed:
  fontpackages-filesystem.noarch 0:1.44-8.el7

Complete!

fontconfig安装成功后在/usr/share目录中就会看到fonts和fontconfig两个目录(没装fontconfig之前是没有这两个目录的

Linux中ImageIO生成图片中文乱码文章的图片

接下来就可以添加字体库了

添加字体

添加字体之前需要先下载相应的字体文件,博主用的是simsun.ttf(宋体)字体库,可以直接点击下载:下载simsun.zip

当然也可以去windows系统下的C:/windows/fonts目录下寻找合适的字体

字体文件准备好后,下边就正式开发操作

首先在/usr/share/fonts/目录下创建目录(名称随意)

mkdir chinese

然后将上方提供的

zip包中的两个文件全部解压并放到新建的目录(chinese)中,

然后修改chinese目录的权限

chmod -R 755 /usr/share/fonts/chinese

接下来需要安装ttmkfdir,这个命令的作用是搜索目录中所有的字体信息,汇总生成fonts.scale文件。

[root@iZ2zebjvditp1bmsZ fonts]# yum -y install ttmkfdir
Loaded plugins: fastestmirror
...
Installed:
  ttmkfdir.x86_64 0:3.0.9-42.el7

Complete!

然后执行ttmkfdir命令:

[root@iZ2zz5rp1bmsZ fonts]# ttmkfdir -e /usr/share/X11/fonts/encodings/encodings.dir

最后修改字体配置文件

vi /etc/fonts/fonts.conf

如下添加配置

Linux中ImageIO生成图片中文乱码文章的图片

<dir>/usr/share/fonts/chinese</dir>

最后保存文件并执行fc-cache进行刷新字体缓存

OK,到此字体就安装完成,在看一下字体列表:

[root@iZ2zebrp1bmsZ fonts]# fc-list
/usr/share/fonts/chinese/simsun.ttc: SimSun\-PUA,宋体\-PUA:style=Regular
/usr/share/fonts/chinese/simsun.ttc: NSimSun,新宋体:style=Regular
/usr/share/fonts/chinese/simsun.ttf: SimSun,宋体:style=Regular
/usr/share/fonts/chinese/simsun.ttc: SimSun,宋体:style=Regular

重新测试生成文件

Linux中ImageIO生成图片中文乱码文章的图片

参考资料

ImageIO drawString 中文乱码问题

Java 的系统属性 sun.jnu.encoding 和 file.encoding 的区别

Linux CentOS 7 安装字体库 & 中文字体


正文到此结束
本文目录