欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

关于R在Linux服务器上生成图片中文乱码原因及解决办法

程序员文章站 2022-06-04 15:51:14
...

乱码原因:

    主要是因为Linux没有对应字体库导致。Linux本身自带字体库(具体有啥,暂不深究),但不包含windows上的,尤其像“微软雅 黑”这样的字体库(主因应该是版权问题);所以在Windows开发R程序,在设置字体后(如“宋体”、“黑体”、“微软雅黑”),在Linux上是无法 显示的。

 

解决办法:

    以CentOS为例,其他版本请自行对照相应路径

1. 在/usr/share/fonts下新建一个微软字体文件夹,如msfonts

2. 将windows系统盘下fonts中的MSYHBD.TTF 、MSYH.TTF 、simhei.ttf 、simsun.ttc 拷贝到linux上步骤1新建的文件夹/usr/share/fonts/msfonts下

3. 修改/etc/fonts/fonts.conf,在<dir>/usr/share/fonts</dir>后增加<dir>/usr/share/fonts/msfonts</dir>,如下

<!-- Font directory list -->
    <dir>/usr/share/fonts</dir>
    <dir>/usr/share/fonts/msfonts</dir>
    <dir>/usr/share/X11/fonts/Type1</dir> <dir>/usr/share/X11/fonts/OTF</dir>
    <dir>~/.fonts</dir>

 

4. 执行fc-cache -f 使得新加的字体立即生效。

5. 修改R程序,在加载Cairo后,设置字体

# 加载Cairo库
library(Cairo)
# 设置字体
CairoFonts(regular = "宋体:style=Regular", bold="微软雅黑:style=Regular")
# 其他画图代码,balabala...

 经测试,只设置第一个参数regular 不起作用,使用的是第二个参数bold的设置,原因不明;其中冒号“:”分隔符后边的style表示使用的样式,Regular正常 Bold粗体

 

关于字体大小是在CairoPNG函数中的pointsize参数设置

CairoPNG(filename = "Rplot.png", width = 480, height = 480, pointsize = 12, bg = "white", res = NA, ...)

 

最后附上Cairo API。

 

另外再补充一句:关于windows上使用UTF-8字符集乱码问题,如果系统默认是GBK字符集,这个问题应该 无解,原因是R运行时环境无法指定字符集。除非用icon函数进行转码,但是这样写的代码没法跨平台执行了。至于更改windows操作系统字符集,或许可以,未测;若有人成功,请给出方案