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)
.
在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)
接受的答案在类似的应用程序(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文件的路径。