就在昨天,坐我对面的平台组同事跟前端同事正在疑惑的讨论联调过程中遇到的问题,大概的情形是这样的,后端同事需要将一个报表数据生成图片,然后传给前端展示,听起来感觉是一个不太麻烦也挺简单的需求,但是他们已经讨论了2天,还是没有解决,他们一直认为可能是前后端传输图片数据编码问题,尝试了将数据编码,前端解码,以及其它一些方式,还是存在问题,他们一直想不通,为何本地联调显示没问题,放到服务器上出现中文乱码问题呢?
当我了解以后,我笑着说,这个问题在我漫长的码农生涯中也遇到过,哈哈,让我们好好一起来看看这个问题。
-
首先,在windows上我们使用如下的代码生成图片
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(5, 5)) # 定义图并设置画板尺寸
fig.set(alpha=0.2)
ax1 = fig.add_subplot(111)
plt.title('测试图')
plt.xlabel('x标签')
plt.ylabel('y标签')
plt.savefig('test.png')
红色部分的中文被正方形替代,这是matplotlib 自带的字体库不支持中文所致,这里加入下面两行代码调用系统中文字体simhei.ttf文件,当然你也可以使用你想要的中文字体,只要放在正确的位置即可,还有一个办法不用添加代码,需要把下载中文字体>放入 matplotlib 字体库路径>修改 matplotlibrc 文件,也能达到效果,下面使用的是第一种方案
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ["SimHei"] # 设置字体
plt.rcParams["axes.unicode_minus"] = False # 该语句解决图像中的“-”负号的乱码问题
fig = plt.figure(figsize=(5, 5)) # 定义图并设置画板尺寸
fig.set(alpha=0.2)
ax1 = fig.add_subplot(111)
plt.title('测试图')
plt.xlabel('x标签')
plt.ylabel('y标签')
plt.savefig('test.png')
中文显示正常。
-
再来看非windows系统,这里用的是centos服务器
扫描二维码关注公众号,回复: 16636556 查看本文章
使用上面在windows系统中文显示没问题的代码,结果如下
中文还是方块,并且代码还有一个警告
通过警告可以知道,centos系统没有该中文字体。
解决办法
1,在windows的C:\Windows\Fonts目录下找到"SimHei"这个字体文件,显示的名字是“黑体 常规”的名字。
2,将上面的C:\Windows\Fonts\simhei.ttf文件,然后复制到centos服务器的/usr/share/fonts/目录下。
3,清除matplotlib缓存,运行指令rm -rf ~/.cache/matplotlib。
4,再次运行代码结果如下,完美解决
当然你也可以使用你自己想要的字体,没有的字体也可以下载,只要放到上面的目录即可使用。
再啰嗦一点,如果应用是部署在容器里,这里稍微说一下方案,需要在项目文件里包含字体文件,在容器镜像文件里,使用命令将字体文件复制到容器/usr/share/fonts/目录下,增加这两条指令就行。
这次分享就到这了,我同事也顺利解决了问题,希望也能够帮助到大家,期待下次相遇,再见。