编织 Rmd 在处理非英文字符时有所不同

3

以下是我尝试编写的可重现示例,它是.Rmd和.r文件的混合体。希望你能明白其原因。

我的问题是,非英文字符在控制台直接运行代码或编织为HTML时会有不同的处理方式。

在下面的示例中,我创建了一个包含字符ü和ö的小数据框,将其写入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")

```

此次工作将成功,因为数据框是在块内创建的

```{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()(其中还包含区域设置),那将是很好的,因为问题可能是特定于平台的。 - Dieter Menne
Windows在编码方面非常麻烦。*nix通常一致使用UTF-8编码。你可以尝试使用UTF-8编码保存数据,例如write.csv(..., fileEncoding = 'UTF-8')(未经测试)。 - Yihui Xie
谢谢@Yihui,加上", fileEncoding = 'UTF-8'"确实解决了问题。在我的系统上,似乎在编织时默认使用UTF-8,但其他情况则不是这样。我必须将我的数据文件转换为“无BOM的UTF-8”,然后确保在读取csv时始终使用UTF-8。 - Andrew
@Andrew е®һйҷ…дёҠпјҢжӣҙиҮӘ然зҡ„ж–№жі•жҳҜеңЁдҪ зҡ„Rд»Јз ҒдёӯдҪҝз”Ёoptions(encoding = 'native.enc')пјҢдҪҶжҲ‘д»Қ然е»әи®®е§Ӣз»ҲдҪҝз”ЁUTF-8гҖӮ - Yihui Xie
1个回答

2
因此,解决方法是保证UTF8编码,例如write.csv(..., fileEncoding = 'UTF-8')。根本问题实际上是RStudio默认使用UTF8,但是R默认使用操作系统的本地编码。我们可以要求R在write.csv中使用UTF8,或者要求RStudio使用本地编码(options(encoding = 'native.enc'))。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接