【问题标题】:Printing UTF-8 characters in R, Rmd, knitr, bookdown在 R、Rmd、knitr、bookdown 中打印 UTF-8 字符
【发布时间】:2018-01-17 17:43:15
【问题描述】:

更新(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/

问题:

我的 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 |

请注意,&lt;U+....&gt; 被打印出来而不是字符。
使用 dt$name &lt;- 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.htmlhttps://tomizonor.wordpress.com/2013/04/17/file-utf8-windowshttps://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


【解决方案1】:

唯一有效的解决方案是 Yihui Xie (knitr developer) 提出的解决方案,即:
创建一个文件.Rprofile,其中包含一行Sys.setlocale("LC_CTYPE", "russian"),并将其放在您的主目录或工作目录中。

但是,请注意,它仅适用于 kable(),即在 knitr 包的帮助下。
如果您尝试使用print(dt$name[1]) 打印,您仍然会得到Áîðèñ Íåìöîâ
然而,如果你使用kable(dt$name[1]),你会得到你需要的——Борис Немцов

【讨论】:

    猜你喜欢
    • 2016-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-08
    • 2019-04-09
    • 1970-01-01
    • 2019-07-22
    • 2014-11-19
    相关资源
    最近更新 更多