R图形中的非拉丁文本(例如阿拉伯语)适用于三台机器,但不适用于另一台机器

时间:2018-05-21 22:24:32

标签: r unicode graphics

使用下面的代码示例:

arabic <-" السعودية"

png("arabic.png", 500, 500, res = 72)
plot(1, 1, type ="n"); text(1,1, arabic, cex = 4)
dev.off()

sessionInfo()

在一台配备RServer Studio的机器上它完美运行(想想 - 我看不懂阿拉伯语......):

enter image description here

而在具有RStudio Server的第二台机器上(以及Linux),它不会: enter image description here

这是第一台工作机器的sessionInfo:

R version 3.3.3 (2017-03-06)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Debian GNU/Linux 9 (stretch)

locale:
 [1] LC_CTYPE=en_NZ.UTF-8       LC_NUMERIC=C               LC_TIME=en_NZ.UTF-8        LC_COLLATE=en_NZ.UTF-8    
 [5] LC_MONETARY=en_NZ.UTF-8    LC_MESSAGES=en_NZ.UTF-8    LC_PAPER=en_NZ.UTF-8       LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C             LC_MEASUREMENT=en_NZ.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

loaded via a namespace (and not attached):
[1] tools_3.3.3

和第二个,不工作:

R version 3.4.4 (2018-03-15)
Platform: x86_64-redhat-linux-gnu (64-bit)
Running under: Amazon Linux 2 (2017.12) LTS Release Candidate

Matrix products: default
BLAS/LAPACK: /usr/lib64/R/lib/libRblas.so

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C               LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
 [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8    LC_PAPER=en_US.UTF-8       LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C             LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

loaded via a namespace (and not attached):
[1] compiler_3.4.4 tools_3.4.4    yaml_2.1.19 

我还应该说我在使用R 3.5和3.4.2的Windows机器上尝试过这个代码并且它工作正常,所以它似乎不太可能是R版本的因素,而是底层机器的东西。我猜测非工作机器缺少某种UTF-8支持,如果我知道它是什么我可以安装它,但我没有。

有什么想法吗?

使用更广​​泛的字符进行更新

为了增加这个谜团,我的不良系统适用于某些类型的角色(基本上是欧洲角色)而不是其他角色。举例说明:

misc <- "pučina, Māori ¡Qué tranza o qué!"
chinese <- "中華民族"
arabic <-" السعودية"
russian <- "катынь"

plot(1, type = "n")
text(1, 1.2, misc)
text(1,1, chinese)
text(1, 0.8, arabic)
text(1, 0.65, russian)

enter image description here

中文和阿拉伯语不起作用;俄罗斯和欧洲字符集的混杂。此外,万一有人想知道:

> Encoding(arabic)
[1] "UTF-8"
> Encoding(misc)
[1] "UTF-8"
> Encoding(chinese)
[1] "UTF-8"

1 个答案:

答案 0 :(得分:0)

所以对此的答案结果非常明显。 R在没有工作的机器上使用的默认字体不具有阿拉伯语和中文unicode字符的字形,而其他机器则没有。其根本原因是一个谜,但解决方案很简单。

首先,我在系统中安装了一个具有大量unicode字符的字体系列。 GNU FreeFont似乎是一个不错的选择。由于我的最终用例(我不知道提前知道了什么语言文字),我想要一个涵盖多种语言的单一家庭。

sudo yum install -y gnu-free-*-fonts
sudo R -e "extrafont::font_import(prompt = FALSE)"

我不确定将字体导入R的第二行是否必要,但它不会造成任何伤害,这确实意味着我可以在R中使用extrafont::fonts()来查看是什么可用。

然后在R中返回一行附加代码,用par(family="FreeSans")设置字体系列。

misc <- "pučina, Māori ¡Qué tranza o qué!"
chinese <- "中華民族"
arabic <-" السعودية"
russian <- "катынь"


par(family="FreeSans")
plot(1, type = "n")
text(1, 1.2, misc)
text(1,1, chinese)
text(1, 0.8, arabic)
text(1, 0.65, russian)

enter image description here