更新(2018年4月):
问题仍然存在,出现在不同的设置和计算机上。
我认为这与所有UNICODE、UTF-8字符有关。
问题:
我的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")
)
以下两种方法都无法解决问题:
方法一
如果我保持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+....>
。使用dt$name <- enc2utf8(as.character(dt$name))
并没有帮助。方法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 |
请注意,字符变成了乱码。
使用
print(dt,encoding="windows-1251"); print(dt,encoding="UTF-8")
没有效果。
有什么建议吗?
我能找到的最接近解决此问题的链接如下,但它们没有帮助:http://blog.rolffredheim.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编码)和其他字符转换/处理包。目前仍然没有帮助。
更新:
en_US.UTF-8
没有问题。但是使用LaTeX就不一样了。 - Martin SchmelzerSys.setlocale("LC_CTYPE", "en_US.UTF-8")
,但是出现了以下错误:OS reports request to set locale to "en_US.UTF-8" cannot be honored[1] ""
。这可能解释了为什么它对您有效,但对我无效(我的本地环境是LC_CTYPE=English_Canada.1252
)。那我该怎么办呢? - IVIM~/.Rprofile
中设置Sys.setlocale(, "Russian")
吗?如果你不知道什么是.Rprofile
,你可以参考https://bookdown.org/yihui/blogdown/global-options.html - Yihui Xieprint(dt)
打印仍然显示相同的乱码,但是使用kable(dt)
打印出了所需的内容!因此结论是 - 放置Sys.setlocale("LC_CTYPE", "russian")
是不够的。您必须将其放在 .Rprofile 中,而且它只适用于kable()
(感谢knitr
开发人员 :) - IVIM