2011-09-13 12 views
8

Sto leggendo un file tramite RJDBC da un database MySQL e visualizza correttamente tutte le lettere in R (ad esempio, נווה שאנן). Tuttavia, anche quando lo si esporta utilizzando write.csv e fileEncoding = "UTF-8", l'output appare come <U+0436>.<U+043A>. <U+041B><U+043E><U+0437><U+0435><U+043D><U+0435><U+0446> (in questo caso non si tratta della stringa sopra ma di quella bulgara) per bulgaro, ebraico, cinese e così via. Altri caratteri speciali come ã, ç ecc funzionano bene.Esporta UTOM-8 BOM in .csv in R

ho il sospetto che questo è perché di UTF-8 BOM, ma non ho trovato una soluzione in rete

Il mio sistema operativo è un Windows7 tedesca.

edit: ho provato

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

e (per quanto ne so) equivalente write.csv(x, file="file.csv",fileEncoding="UTF-8",row.names=FALSE).

+2

Stai dicendo che quando apri il file esportato, vedi "U + 0436" invece di "ж"? Se non si tratta di un problema di distinta base, solo un problema dei punti del codice Unicode non viene codificato in una codifica UTF, ma viene emesso come punti di codice. Forse mostraci del codice come esattamente stai esportando il file? – deceze

+0

Ho aggiunto informazioni su come ho esportato il file. E sì, vedo "" invece di "ж" –

+1

Vedere "" nel file è ambiguo (potrebbe anche significare che quei caratteri siano effettivamente in linea in quel file o che l'editor non sia in grado di visualizzarli). Potresti scriverci "ж" in un file e dirci i valori esadecimali di tutti i caratteri contenuti nel file generato (aprilo in un editor esadecimale); O dacci il codice per riprodurre il tuo problema (ovviamente non abbiamo il tuo DB, quindi crea un vettore con i dati di esempio). –

risposta

5

Nella pagina di aiuto a Encoding (help("Encoding")) è possibile leggere sulla codifica speciale - bytes.

Usando questo sono stato in grado di generare file CSV da:

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) 

Fare attenzione sulle differenze tra factor e character. Il seguente dovrebbe funzionare:

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

La risposta accettata non mi ha aiutato in un'applicazione simile (R 3.1 in Windows, mentre io cercavo di aprire il file in Excel). In ogni caso, sulla base di questa parte del file di documentazione:

Se è necessaria una distinta base (è sconsigliato) quando la scrittura dovrebbe essere scritto in modo esplicito, ad esempio, da writeChar ("\ ufeff", con, eos = NULL) o writeBin (as.raw (c (0xEF, 0xBB, 0xBF)), binary_con)

Sono venuto con la seguente soluzione:

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

Nota che df è il data.frame e nome è il percorso del file CSV.