【问题标题】:Knitting Rmd treats non-english characters differentlyKnitting Rmd 对非英文字符的处理方式不同
【发布时间】:2012-06-24 12:29:44
【问题描述】:

我尝试在下面编写可重现的示例。它是 .Rmd 和 .r 的混合体。希望你能明白为什么。

我遇到的问题是非英文字符的处理方式不同,具体取决于代码是直接在控制台中运行还是在针织为 HTML 时运行。

在下面的示例中,我创建了一个带有字符 ü 和 ö 的小型 data.frame,将其写入 csv,然后再次读回。

如果写入和读取都发生在块的内部或外部,那么一切都很好。

但是,如果写入和读取发生在不同的地方,则使用不同的编码(我认为)。和字符混淆。

这意味着在读取数据时,编译 .Rmd 文件时需要与直接在 R 中工作时不同的编码。

据我所知,语言环境总是相同的,所以我不明白发生了什么。

有什么想法吗?

直接读写csv创建新数据文件

df2 <- data.frame(Cäl1 = c(1,2), Col2 = c("ü","a")) 

write.csv(df2, file="df2.csv")

read.csv("df2.csv")

Sys.getlocale(category = "LC_ALL")

现在尝试编织整个文档(只是运行块的行为不同)

```{r read_inside}

read.csv("df2.csv")

Sys.getlocale(category = "LC_ALL")

```

第二个块会起作用,因为 data.frame 是在块内创建的

```{r write_read_inside}


df2 <- data.frame(Cäl1 = c(1,2), Col2 = c("ü","a")) 
write.csv(df2, file="df2.csv")
read.csv("df2.csv")

Sys.getlocale(category = "LC_ALL")

```

会话信息:

R version 2.15.0 (2012-03-30)
Platform: x86_64-pc-mingw32/x64 (64-bit)

locale:
[1] LC_COLLATE=English_United Kingdom.1252  LC_CTYPE=English_United Kingdom.1252    LC_MONETARY=English_United Kingdom.1252
[4] LC_NUMERIC=C                            LC_TIME=English_United Kingdom.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

loaded via a namespace (and not attached):
[1] tools_2.15.0

【问题讨论】:

  • 我尝试了您的示例,但无法确认您找到了什么(Windows 7,德语)。如果您可以发布 sessionInfo() (还包含语言环境)会很好,问题可能是特定于平台的。
  • Windows 在编码方面简直就是地狱。 *nix 经常一致地使用 UTF-8。您可能可以尝试使用 UTF-8 编码来保存您的数据,例如 write.csv(..., fileEncoding = 'UTF-8')(未测试)
  • 感谢@Yihui,添加 ", fileEncoding = 'UTF-8'" 确实解决了问题。在我的系统上似乎在编织时默认使用 UTF-8,但在其他情况下不使用。我必须将我的数据文件转换为“UTF-8 without BOM”,然后确保在读取 csv 时始终使用 UTF-8。
  • @Andrew 实际上另一种方式(更自然)是在您的 R 代码中使用 options(encoding = 'native.enc'),但我仍然建议始终使用 UTF-8。

标签: r knitr


【解决方案1】:

所以答案是保证 UTF8 编码,例如write.csv(..., fileEncoding = 'UTF-8')。根本问题实际上是 RStudio 默认使用 UTF8,但 R 默认使用 OS 的本机编码。我们可以让 R 在write.csv 中使用 UTF8,或者让 RStudio 使用原生编码 (options(encoding = 'native.enc'))。

【讨论】:

    猜你喜欢
    • 2012-08-19
    • 1970-01-01
    • 2016-12-13
    • 2021-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-25
    • 2016-12-27
    相关资源
    最近更新 更多