Windows系统下R绘图Unicode字符显示异常的原因问询
问题:R中同一Unicode字符控制台显示正常,绘图时直接传参显示失败,包裹expression后正常的原因
关联问题:this question
在尝试解答上述关联问题时,我发现了如下现象:
> '\u226A' [1] "≪"
但当我尝试在绘图中使用同一个符号时,显示的却是方块占位符:
plot(1, 1, main = '\u226A')
Unicode标题显示失败(原图示为方块占位符)
而如果我将该字符包裹在空expression中,符号就能正常显示:
plot(1, 1, main = expression('\u226A' ~ ''))
Unicode标题显示正常(原图示为正常显示的≪符号)
我的问题是:为什么该Unicode字符在R控制台可以正常显示,第一种绘图方式下显示失败,第二种包裹expression的方式又可以正常显示?
附系统和R版本信息如下:
> Sys.info() sysname release version nodename machine "Windows" "10 x64" "build 19043" "LAPTOP-NGIP5B78" "x86-64" login user effective_user "olive" "olive" "olive" > sessionInfo() R version 4.1.0 (2021-05-18) Platform: x86_64-w64-mingw32/x64 (64-bit) Running under: Windows 10 x64 (build 19043) Matrix products: default locale: [1] LC_COLLATE=English_Denmark.1252 LC_CTYPE=English_Denmark.1252 [3] LC_MONETARY=English_Denmark.1252 LC_NUMERIC=C [5] LC_TIME=English_Denmark.1252 attached base packages: [1] stats graphics grDevices utils datasets methods base loaded via a namespace (and not attached): [1] compiler_4.1.0 tools_4.1.0 Rcpp_1.0.6 cellranger_1.1.0 readxl_1.3.1
回答
原因说明
- 控制台可正常显示的原因:R控制台调用的是系统层面的文本渲染逻辑,支持自动字体 fallback:当你当前控制台默认字体没有覆盖
U+226A(远小于号≪)这个Unicode字符时,系统会自动匹配其他安装了的、包含该字符的字体来渲染,因此可以正常显示。 - 直接传字符串到plot标题显示失败的原因:你使用的是Windows平台的R 4.1默认图形设备,该设备处理普通文本字符串时,会优先匹配你系统locale(当前是1252西欧编码)对应的默认字体,这类字体通常仅覆盖西欧常用字符,没有包含该数学符号的字形;且默认图形设备处理普通字符串时不支持自动字体 fallback,找不到对应字形就会显示方块占位符。
- 包裹expression后可正常显示的原因:
expression是R的plotmath数学表达式对象,当图形参数接收到expression类型的值时,会自动切换到数学符号渲染逻辑:该逻辑会专门调用支持数学符号的字体库(如系统内置的Symbol字体)来匹配字符,因此可以正确加载到U+226A的字形完成渲染。
替代解决方案
如果不想每次都写expression包裹字符,也可以通过以下两种方式解决普通字符串的Unicode符号显示问题:
- 切换到支持字体 fallback 的cairo图形设备:
# 绘图前先运行该代码,设置默认Windows图形设备用cairo渲染 options(grDevices.windows.options = list(type = "cairo"))
- 手动指定图形设备使用包含该符号的字体:
# 示例:指定使用支持全字符的微软雅黑作为绘图字体 windowsFonts(yahei = windowsFont("微软雅黑")) par(family = "yahei")
内容的提问来源于stack exchange,提问作者Oliver
相关产品推荐
相关产品推荐

