【发布时间】:2018-01-17 17:43:15
【问题描述】:
更新(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")
)
以下都不行:
方式 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+....> 被打印出来而不是字符。
使用 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 编码)和其他一些字符转换/处理包来保存我的文件。还没有任何帮助。
更新:
打开的相关问题: How to change Sys.setlocale, when you get Error "request to set locale … cannot be honored"
【问题讨论】:
-
在打印到控制台或编写 HTML 文档时,使用本地语言环境
en_US.UTF-8没有问题。使用 LaTeX 是另一回事。 -
感谢您的尝试 - 我尝试将我的语言环境设置为您所拥有的 `Sys.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)。那我该怎么办? -
我找到了来自 knitr 开发者的两个相关建议:stackoverflow.com/questions/15703702/… 和 stackoverflow.com/questions/27982566/…。想法是将 UTF-8 代码移动到 单独的文件 中,然后从那里读取:
con = file("TestSpanishText.R", encoding = "UTF-8"); read_chunk(con);close(con)- -
您可以尝试在您的
~/.Rprofile中设置Sys.setlocale(, "Russian")吗?如果你不知道.Rprofile是什么,你可能会看到bookdown.org/yihui/blogdown/global-options.html -
太棒了! - 我这样做了,用
print(dt)打印仍然显示相同的乱码,但是用`kable(dt)` 打印产生了所需要的!所以结论 - 输入Sys.setlocale("LC_CTYPE", "russian")是不够的。您必须将其放入 .Rprofile 并且...它专门与kable()一起使用(感谢knitr开发人员:)
标签: r unicode utf-8 knitr bookdown