2011-09-13 27 views
8

我從MySQL數據庫讀取通過RJDBC文件.csv和它正確顯示中的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至R中

我懷疑這是因爲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)

+2

你是說當你打開導出的文件時,你會看到「U + 0436」而不是「ж」?如果這樣做不存在BOM問題,那麼Unicode代碼點的問題不會被編碼爲UTF編碼,而是作爲代碼點輸出。也許向我們展示一些代碼如何導出文件? – deceze

+0

我添加了關於如何導出文件的信息。是的,我看到「」而不是「ж」 –

+1

在文件中看到「」是不明確的(甚至可能意味着這些字符實際上是在該文件中內聯的,或者編輯器無法顯示它們)。您可以將「ж」寫入文件中,並告訴我們生成的文件包含的所有字符的十六進制值(在十六進制編輯器中打開它);或者給我們代碼來重現你的問題(當然,我們沒有你的數據庫,所以用樣本數據創建一個向量)。 –

回答

5

在幫助頁面到Encodinghelp("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) 

採取關心factorcharacter之間的差異。下面應該工作:

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) 
2

接受的答案沒有幫助我在一個類似的應用程序(R 3.1在Windows中,當我試圖在Excel中打開文件)。總之,基於文件文檔的這一部分:

如果需要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和文件名是csv文件的路徑。