gpt4 book ai didi

r - 在 R、Rmd、knitr、bookdown 中打印 UTF-8 字符

转载 作者:行者123 更新时间:2023-12-04 10:49:02 25 4
gpt4 key购买 nike

更新(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")
)

以下都不起作用:

方式一

如果我保持 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))没有帮助。

方式二

如果我改变 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"

最佳答案

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

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

关于r - 在 R、Rmd、knitr、bookdown 中打印 UTF-8 字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48307007/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com