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

问题描述 投票:0回答:3

我正在通过 RJDBC 从 MySQL 数据库读取文件,它正确显示 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)

以及(据我所知)等效的

write.csv(x, file="file.csv",fileEncoding="UTF-8",row.names=FALSE)

r utf-8 byte-order-mark export-to-csv
3个回答
12
投票

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

如果在书写时需要(不建议)BOM,则应明确书写,例如:通过 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)})
}

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


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)

注意

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)

0
投票

我遇到了这个问题,我使用 readr 包修复了它!

readr::write_excel_csv(your_data,"your_data.csv")
© www.soinside.com 2019 - 2024. All rights reserved.