更新(2018 年 4 月):
在不同的设置和计算机下,问题仍然存在。
我相信它与所有 UNICODE、UTF-8 字符有关。
https://www.joelonsoftware.com/2003/10/08/the-absolute-minimum-every-software-developer-absolutely-positively-must-know-about-unicode-and-character-sets-no-excuses/
PROBLEM:
我的 Rmd/R 文件以 UTF-8 编码保存。其他sessionInfo()
细节:
Platform: x86_64-w64-mingw32/x64 (64-bit)
LC_CTYPE=English_Canada.1252
other attached packages:
[1] knitr_1.17
这是一个简单的数据框,我需要将其打印为 html 文档中的表格,例如和kable(dt)
或任何其他方式。
dt <- data.frame(
name=c("Борис Немцов","Martin Luter King"),
year=c("2015","1968")
)
以下任一方法都不起作用:
Way 1
如果我保持 Sys.setlocale() 不变(即"English_Canada.1252"
),然后我得到这个:
> dt;
name year
1 <U+0411><U+043E><U+0440><U+0438><U+0441> <U+041D><U+0435><U+043C><U+0446><U+043E><U+0432> 2015
2 Martin Luter King 1968
> kable(dt)
|name |year |
|:-----------------------------------------------------------------------------------------|:----|
|<U+0411><U+043E><U+0440><U+0438><U+0441> <U+041D><U+0435><U+043C><U+0446><U+043E><U+0432> |2015 |
|Martin Luter King |1968 |
注意<U+....>
打印而不是字符。
Using dt$name <- enc2utf8(as.character(dt$name))
没有帮助。
Way 2
如果我改变Sys.setlocale("LC_CTYPE", "russian")
#“Russian_Russia.1251”`,
然后我得到这个:
> dt;
name year
1 Áîðèñ Íåìöîâ 2015
2 Martin Luter King 1968
> kable(dt)
|name |year |
|:-----------------|:----|
|Áîðèñ Íåìöîâ |2015 |
|Martin Luter King |1968 |
请注意,字符已变成乱码。
Using print(dt,encoding="windows-1251"); print(dt,encoding="UTF-8")
没有效果。
有什么建议吗?
我能找到的最接近解决此问题的链接位于以下链接中,但它们没有帮助:http://blog.rolfredheim.com/2013/01/r-and-foreign-characters.html, https://tomizonor.wordpress.com/2013/04/17/file-utf8-windows, https://www.smashingmagazine.com/2012/06/all-about-unicode-utf8-character-sets
我还尝试使用 1251 编码(而不是当前的 UTF-8 编码)和其他一些字符转换/处理包保存我的文件。还没有什么帮助。
UPDATE:
打开相关问题:当出现错误“请求设置区域设置……无法兑现”时,如何更改 Sys.setlocale