使用下面的代码示例:
arabic <-" السعودية"
png("arabic.png", 500, 500, res = 72)
plot(1, 1, type ="n"); text(1,1, arabic, cex = 4)
dev.off()
sessionInfo()
在一台配备RServer Studio的机器上它完美运行(想想 - 我看不懂阿拉伯语......):
而在具有RStudio Server的第二台机器上(以及Linux),它不会:
这是第一台工作机器的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)
中文和阿拉伯语不起作用;俄罗斯和欧洲字符集的混杂。此外,万一有人想知道:
> Encoding(arabic)
[1] "UTF-8"
> Encoding(misc)
[1] "UTF-8"
> Encoding(chinese)
[1] "UTF-8"
答案 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)