2011-09-13 37 views
8

Estoy leyendo un archivo a través de RJDBC desde una base de datos MySQL y muestra correctamente todas las letras en R (por ejemplo, נווה שאנן). Sin embargo, incluso al exportarlo utilizando write.csv y fileEncoding = "UTF-8" la salida se ve como <U+0436>.<U+043A>. <U+041B><U+043E><U+0437><U+0435><U+043D><U+0435><U+0446> (en este caso, esta no es la cadena anterior, sino una búlgara) para búlgaro, hebreo, chino, etc. Otros caracteres especiales como ã, ç etc funcionan bien.Exportar BOM UTF-8 a .csv en R

Sospecho que esto se debe a BOM UTF-8, pero que no encontrar una solución en la red

Mi sistema operativo Windows 7 es un alemán.

editar: Me trató

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

y el (que yo sepa) equivalente write.csv(x, file="file.csv",fileEncoding="UTF-8",row.names=FALSE).

+2

¿Está diciendo que cuando abre el archivo exportado, ve "U + 0436" en lugar de "ж"? Si eso no es un problema de BOM, solo un problema del código Unicode no se codifica en una codificación UTF, sino que se genera como puntos de código. Tal vez nos muestre un código de cómo exactamente está exportando el archivo? – deceze

+0

Agregué información sobre cómo exporté el archivo. Y sí, veo "" en lugar de "ж" –

+1

Ver "" en el archivo es ambiguo (incluso podría significar que esos caracteres están realmente insertados en ese archivo o que su editor simplemente no puede mostrarlos). Podrías escribirnos el "ж" en un archivo y decirnos los valores hexadecimales de todos los caracteres que contiene el archivo generado (ábrelo en un editor hexadecimal); O dénos el código para reproducir su problema (por supuesto, no tenemos su base de datos, por lo tanto, cree un vector con los datos de muestra). –

Respuesta

5

En la página de ayuda al Encoding (help("Encoding")) puede leer sobre la codificación especial - bytes.

El uso de este yo era capaz de generar el archivo csv por:

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) 

Tenga cuidado acerca de las diferencias entre factor y character. El siguiente debería funcionar:

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 respuesta aceptada no me ayuda en una aplicación similar (R 3.1 en Windows, mientras que yo estaba tratando de abrir el archivo en Excel). De todos modos, basado en esta parte del archivo de documentación:

Si se requiere una lista de materiales (no se recomienda) al escribir debe ser escrito de forma explícita, por ejemplo, por writeChar ("\ ufeff", estafa, eos = NULL) o writeBin (as.raw (c (0xEF, 0xBB, 0xbf)), binary_con)

me ocurrió con la siguiente solución:

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

Tenga en cuenta que df es el nombre del archivo hoja.de.datos y es la ruta de acceso al archivo csv.