具有特殊字符的 writeLines 行为

writeLines behavior with special characters

当 运行 R (R Studio) 中的以下行时:

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

我得到不同的结果。

有了电脑,我得到了

hello ðŸŒ

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

还有 mac

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

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

我在这里对这个问题写了一个有点长的答案: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) 并且这种转换通常是有损的。