前面遇到的这个问题后,再网上找了很多解决办法,花了两天时间试过了许多方法才搞定了(因为我使用的docker部署的代码,安装字体后也一直没有意识到docker的这个问题,如果一早就意识到这个问题根本不需要花这么多时间,所以记录一下问题,方便以后处理同样的问题)
可能纯在的问题
1、中文变成‘?’或其他字符的乱码,这是编码的问题,将编码改为utf-8即可
2、中文变成下图中的方框,这是字体的问题,即你在Graphics2D中使用的字体在你部署的Linux环境中是没有的;还有一种情况是,你Linux环境中是有你使用的字体,但你使用的docker等容器部署的Java代码(你可以理解docker容器是Linux中的虚拟机),此时docker容器中也是无法直接使用这个字体的,你需要做一个文件映射
解决方式:
第一步、先在Linux中安装中文字体(如果有了则跳过)
1、先使用yum install fontconfig命令安装fontconfig插件
yum install fontconfig
2、安装更新字体命令
yum install mkfontscale
3、使用fc-list :lang=zh命令查看已安装的中文字体
fc-list :lang=zh
//如果有中文字体是会打印出已有的中文字体的,如下
[root@localhost ~]# fc-list :lang=zh
/usr/share/fonts/chinese/fallback/msjh.ttc: Microsoft JhengHei UI:style=Regular
/usr/share/fonts/chinese/fallback/simsun.ttc: 宋体,SimSun:style=常规,Regular
/usr/share/fonts/chinese/STXINGKA.TTF: STXingkai:style=Regular
/usr/share/fonts/chinese/PF/PingFang.ttc: .蘋方\-簡,.PingFang SC:style=中粗體,Semibold
/usr/share/fonts/chinese/PF/PingFang.ttc: .蘋方\-繁,.PingFang TC:style=中粗體,Semibold
/usr/share/fonts/chinese/PF/PingFang.ttc: .蘋方\-港,.PingFang HK:style=中粗體,Semibold
/usr/share/fonts/chinese/PF/PingFang.ttc: .蘋方\-簡,.PingFang SC:style=極細體,Ultralight
/usr/share/fonts/chinese/msyh.ttc: Microsoft YaHei:style=Normal
/usr/share/fonts/chinese/fallback/msyh.ttc: Microsoft YaHei UI:style=Normal
4、没有你需要的中文字体,就需要安装
//先创建中文字体库的目录,Linux的默认字体库目录是/usr/share/fonts里面有Linux自带的字体
mkdir /usr/share/fonts/chinese
cd /usr/share/fonts/chinese
//设置这个目录的访问权限
chmod -R 755 /usr/share/fonts/chinese
5、使用ftp上传需要(ttf或ttc格式)的字体库到我们新创建的中文字体库中
如果没有字体库,可以去网上下载,或者在Windows本地C:\Windows\Fonts中找到你要的字体复制到其他路径下文件会变成ttf格式
字体库下载链接:https://pan.baidu.com/s/1gOFGcr9wL8VSLwSy67IotQ
提取码:758y
然后再将这些字体上传到Linux中
6、关联使用上传的字体库
cd /usr/share/fonts/chinese
mkfontscale
mkfontdir
fc-cache
7、再次查看是否安装成功,如果有了你需要的中文字体就可以再试试重新绘制图片了
[root@localhost ~]# fc-list :lang=zh /usr/share/fonts/chinese/fallback/msjh.ttc: Microsoft JhengHei UI:style=Regular /usr/share/fonts/chinese/fallback/simsun.ttc: 宋体,SimSun:style=常规,Regular /usr/share/fonts/chinese/STXINGKA.TTF: STXingkai:style=Regular /usr/share/fonts/chinese/PF/PingFang.ttc: .蘋方\-簡,.PingFang SC:style=中粗體,Semibold /usr/share/fonts/chinese/PF/PingFang.ttc: .蘋方\-繁,.PingFang TC:style=中粗體,Semibold /usr/share/fonts/chinese/PF/PingFang.ttc: .蘋方\-港,.PingFang HK:style=中粗體,Semibold /usr/share/fonts/chinese/PF/PingFang.ttc: .蘋方\-簡,.PingFang SC:style=極細體,Ultralight /usr/share/fonts/chinese/msyh.ttc: Microsoft YaHei:style=Normal /usr/share/fonts/chinese/fallback/msyh.ttc: Microsoft YaHei UI:style=Normal
二、如果使用的是docker等容器部署Java代码,这里就还没完,这里还需要做一个文件映射
1、使用docker exec -it <container_name> /bin/bash命令进入你的docker环境(其中,<container_name>是要进入的docker容器的名称或者ID。这将在容器中打开一个新的bash终端。)
docker exec -it <container_name> /bin/bash
//也可以使用docker attach命令来进入正在运行的docker容器。运行如下命令:
docker attach <container_name>
2、进入后用下面命令重新检查docker中是否有你需要的中文字体(容器中已安装fontconfig插件的就没必要再安装了)
yum install fontconfig
fc-list :lang=zh
3、如果没有中文字体库,需要将外面Linux的字体库挂在到docker中
//先使用exit命令退出容器再做下面的操作
exit
//要将宿主机的/usr/share/fonts/chinese目录挂载到容器的/usr/share/fonts/chinese目录:
docker run -v /usr/share/fonts/chinese:/usr/share/fonts/chinese ubuntu:latest bash
//如果容器已经在运行,可以使用 docker cp
命令将文件复制到容器内部12。命令格式为:docker cp <源路径> <容器名称>:<目标路径>
docker cp /home/user/file.txt my_container:/usr/src/app/
//然后再进入容器检查字体是否可以使用
docker attach <container_name>
fc-list :lang=zh
4、如果使用Jenkins部署的项目可以再其中添加Execute shell script on remote host using ssh命令,如下
添加完后保存,重新构建项目即可,下面是解决后效果图