具有特殊字符的writeLines行为

时间:2019-05-04 12:10:39

标签: r encoding character-encoding rstudio special-characters

在R(R Studio)中运行以下代码时:

writeLines("hello \U1F30D",useBytes = T)

我得到不同的结果。

有了PC,我得到了

hello ðŸŒ

writeLines("hello \U1F30D",useBytes = F)
hello <U+0001F30D>

使用Mac

writeLines("hello \U1F30D",useBytes = F)
hello 

我认为该行为与机器无关。它应该是编码。但是我检查了R Studio的编码,两者都为UTF-8。所以现在我不知道为什么会有不同的行为,有人可以解释这些差异吗?

1 个答案:

答案 0 :(得分:1)

我在这里为这个问题写了一个有点长的答案:https://kevinushey.github.io/blog/2018/02/21/string-encoding-and-r/

简短答案:writeLines("<text>", useBytes = FALSE)将尝试将提供的文本重新编码为本地编码。这在使用UTF-8语言环境的Unix系统上有效(当今是默认设置),但在这种情况下(例如,在Windows上)将失败。实际上,您需要以下内容:

writeLines("<text>", file, useBytes = TRUE)
readLines(file, encoding = "UTF-8")

请注意,在Windows上诊断编码问题可能具有挑战性,因为R会相当积极地将UTF-8文本重新编码为本机编码(有时会尝试将UTF-8->本机-> UTF-8往返)转化通常是有损失的。