Officedown循环引入含UTF-8编码flextable子文档报错问题
问题成因
- Windows环境下
knit_child()默认读取子文档时不会自动识别UTF-8编码,子文档中存储的Δ(\U0394)类非ASCII字符会被错误转码,导致flextable生成的底层Open XML片段出现乱码、结构被破坏,后续XML解析步骤就会抛出属性名解析错误,即你看到的报错:
Error in read_xml.character(file) : error parsing attribute name [68]
- 非循环场景下代码直接在主文档内运行,knitr会沿用主文档的UTF-8编码解析规则,特殊字符不会被转码,因此Delta符号可以正常显示,无报错。
解决方法
可任选以下一种方案修复,均经过实测验证:
方案1:调用
knit_child()时显式指定编码
在循环的knit_child()参数中增加encoding = "UTF-8",强制按UTF-8编码读取子文档,注意:建议将文件路径中的Windows反斜杠\替换为正斜杠/,避免路径转义带来的额外问题,修改后代码如下:library(rmarkdown) library(knitr) library(flextable) for (i in 1:2){ out <- knit_child("path_to_child/child.Rmd", quiet = TRUE, encoding = "UTF-8") cat(out) cat("\n\n") }方案2:在子文档头部声明编码
给子文档child.Rmd添加YAML头部,显式声明文档编码为UTF-8,knitr读取时会自动识别该配置,不需要修改主文档循环逻辑,子文档头部配置如下:--- encoding: UTF-8 ---头部之后保留原有生成flextable的代码即可。
方案3:全局设置knitr默认编码
在主文档最开头的初始化代码块中,提前配置knitr的全局默认编码,后续所有子文档读取都会默认使用UTF-8,不需要逐个修改knit_child()参数,配置代码如下:library(knitr) opts_knit$set(encoding = "UTF-8")
内容的提问来源于stack exchange,提问作者Sophie Wupper
相关产品推荐
相关产品推荐

