在R中将UTF-8 BOM导出到.csv

Art*_*r G 9 byte-order-mark r utf-8 export-to-csv

我正在从MySQL数据库通过RJDBC读取文件,它正确显示R中的所有字母(例如,נווהשאנן).但是,即使使用write.csv和fileEncoding ="UTF-8"导出它,输出看起来像 <U+0436>.<U+043A>. <U+041B><U+043E><U+0437><U+0435><U+043D><U+0435><U+0446>(在这种情况下,这不是上面的字符串而是保加利亚字符串),用于保加利亚语,希伯来语,中文等等.其他特殊字符,如ã,ç等工作正常.

我怀疑这是因为UTF-8 BOM,但我没有在网上找到解决方案

我的操作系统是德语Windows7.

编辑:我试过了

con<-file("file.csv",encoding="UTF-8")
write.csv(x,con,row.names=FALSE)
Run Code Online (Sandbox Code Playgroud)

和(afaik)等价物write.csv(x, file="file.csv",fileEncoding="UTF-8",row.names=FALSE).

Mar*_*rek 6

Encoding(help("Encoding"))的帮助页面上,您可以阅读有关特殊编码的信息bytes.

使用这个我能够通过以下方式生成csv文件:

v <- "???? ????"
X <- data.frame(v1=rep(v,3), v2=LETTERS[1:3], v3=0, stringsAsFactors=FALSE)

Encoding(X$v1) <- "bytes"
write.csv(X, "test.csv", row.names=FALSE)
Run Code Online (Sandbox Code Playgroud)

注意factor和之间的差异character.以下应该有效:

id_characters <- which(sapply(X,
    function(x) is.character(x) && Encoding(x)=="UTF-8"))
for (i in id_characters) Encoding(X[[i]]) <- "bytes"

id_factors <- which(sapply(X,
    function(x) is.factor(x) && Encoding(levels(x))=="UTF-8"))
for (i in id_factors) Encoding(levels(X[[i]])) <- "bytes"

write.csv(X, "test.csv", row.names=FALSE)
Run Code Online (Sandbox Code Playgroud)


Ron*_*Ron 6

接受的答案在类似的应用程序(Windows中的R 3.1,而我试图在Excel中打开文件)中没有帮助我。无论如何,基于文件文档的这一部分:

如果在编写时需要物料清单(不建议使用),则应明确写入,例如,通过writeChar(“ \ ufeff”,con,eos = NULL)或writeBin(as.raw(c(0xef,0xbb,0xbf)) ,binary_con)

我想出了以下解决方法:

write.csv.utf8.BOM <- function(df, filename)
{
    con <- file(filename, "w")
    tryCatch({
    for (i in 1:ncol(df))
        df[,i] = iconv(df[,i], to = "UTF-8") 
    writeChar(iconv("\ufeff", to = "UTF-8"), con, eos = NULL)
    write.csv(df, file = con)
    },finally = {close(con)})
}
Run Code Online (Sandbox Code Playgroud)

请注意,df是data.frame,文件名是csv文件的路径。

  • 这很棒。这应该是公认的答案(Windows 7,R 版本 3.4.2) (2认同)
  • 在 R 3.5.3 上仍然运行良好。只是两个小注释:您可以只使用 on.exit(close(con)) 来代替 `tryCatch()` 构造。将 `fileEncoding = "utf-8"` 传递给 `write. 也可能很有用。 csv()`以获得最佳结果。 (2认同)