原创者:文思
继上一篇代码编写和部署后,这次测试发现转换后的pdf的中文都是乱码,作为程序员的我第一时间就去想到了gbk与utf-8之间的字符集编码转换问题。首先在本地windows环境测试,生成的pdf不是乱码,后来把docx都改成了odt,然后又尝试用流的形式加上utf-8参数中转一下,也不行。百度上有说是linux没有中文字符集,那就试试看了。
要查看系统中已经安装的字体,我们可以使用fc-list命令进行查看。如果系统中没有该命令的话,我们需要先安装相关的软件包。
yum install -y fontconfig mkfontscale
fc-list :lang=zh
可以看到默认情况下是没有安装中文字体的。
我们现在需要把楷体文件上传到linux服务器上。在windows下找到
复制到linux系统的/usr/share/fonts/目录下
再次命令查看:
运行doc转pdf:
已中文乱码问题已经解决,可显示。添加一种字体即可,其它没有的字体都会转成成此字体,如果也想展示其它字体的效果,依次添加其它字体。
续:
测试环境ok了,在生产环境上也出现中文乱码了,将生产环境也以上述安装了一个字体后还是乱码,就用env和locale命令查看字符集:
生产环境上env:
LANG=en_US.UTF-8
没有乱码问题的测试环境上env:
LANG=zh_CN.UTF-8
运行local查看字符集:
生产环境上locale:
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
没有乱码问题的测试环境上locale:
LANG=zh_CN.UTF-8
LC_CTYPE="zh_CN.UTF-8"
LC_NUMERIC="zh_CN.UTF-8"
LC_TIME="zh_CN.UTF-8"
LC_COLLATE="zh_CN.UTF-8"
LC_MONETARY="zh_CN.UTF-8"
LC_MESSAGES="zh_CN.UTF-8"
LC_PAPER="zh_CN.UTF-8"
LC_NAME="zh_CN.UTF-8"
LC_ADDRESS="zh_CN.UTF-8"
LC_TELEPHONE="zh_CN.UTF-8"
LC_MEASUREMENT="zh_CN.UTF-8"
LC_IDENTIFICATION="zh_CN.UTF-8"
LC_ALL=
字符集不一样,新打开了一个shell命令窗口设置生产环境字符集为zh_CN.UTF-8,然后在原来的shell命令窗口重启服务,注意,刚才操作是新打开了一个命令窗口进行字符集设置的,重启服务是在原来老的命令窗口重启的。重启后竟然没有生效还是乱码,到这一步真快疯了,后来在原有的shell命令窗口再次查看字符集发现字符集没变,就猜想原来的shell命令窗口只对当前的环境有效,对其它新窗口设置的环境没有加载和生效,原理有些类似在window的命令行界面下的环境变量set设置原理,只对当前窗口有效。于是重新打开一个新的shell命令窗口,重启服务,一下ok了,问题圆满解决。