2011-09-13 8 views
8

Je lis un fichier via RJDBC à partir d'une base de données MySQL et affiche correctement toutes les lettres dans R (par exemple, נווה שאנן). Cependant, même en l'exportant en utilisant write.csv et fileEncoding = "UTF-8" la sortie ressemble à <U+0436>.<U+043A>. <U+041B><U+043E><U+0437><U+0435><U+043D><U+0435><U+0446> (dans ce cas, ce n'est pas la chaîne ci-dessus mais bulgare) pour le bulgare, hébreu, chinois et ainsi de suite. D'autres caractères spéciaux comme ã, ç etc fonctionnent bien.Exporter la commande UTF-8 vers .csv dans R

Je suspecte que ce soit en raison de BOM UTF-8, mais je ne l'ai pas trouvé une solution sur le net

Mon OS est un Windows7 allemand.

modifier: J'ai essayé

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

et l'équivalent (afaik) write.csv(x, file="file.csv",fileEncoding="UTF-8",row.names=FALSE).

+2

Dites-vous que lorsque vous ouvrez le fichier exporté, vous voyez "U + 0436" au lieu de "ж"? Si tel n'est pas le cas, les numéros de code Unicode ne sont pas encodés dans un codage UTF, mais sortent en tant que points de code. Peut-être nous montrer du code comment exactement vous exportez le fichier? – deceze

+0

J'ai ajouté des informations sur la façon dont j'ai exporté le fichier. Et oui, je vois "" au lieu de "ж" –

+1

Voyant "" dans le fichier est ambigu (cela peut même signifier que ces caractères sont réellement en ligne dans ce fichier ou votre éditeur ne peut tout simplement pas les afficher). Vous pouvez soit nous écrire le "ж" dans un fichier et nous dire les valeurs hexadécimales de tous les caractères que le fichier généré contient (ouvrez-le dans un éditeur hexadécimal); OU donnez-nous le code pour reproduire votre problème (bien sûr, nous n'avons pas votre DB, donc créez un vecteur avec les données d'exemple). –

Répondre

5

Sur la page d'aide à Encoding (help("Encoding")), vous pouvez lire à propos de l'encodage spécial - bytes.

L'utilisation de ce que j'ai pu générer un fichier csv par:

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) 

Prenez soin des différences entre factor et character. Ce qui suit devrait fonctionner:

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 réponse acceptée ne m'a pas aidé dans une application similaire (R 3.1 dans Windows, alors que je tentais d'ouvrir le fichier dans Excel). Quoi qu'il en soit, sur la base de cette partie fichier documentation:

Si une nomenclature est nécessaire (il est non recommandé) lors de l'écriture, il doit être écrit explicitement, par exemple par writeChar ("\ ufeff", con, eos = NULL) ou writeBin (as.raw (c (0xEF, 0xBB, 0xbf)), binary_con)

je suis venu avec la solution suivante:

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

Notez que df est le data.frame et nom est le chemin vers le fichier csv.

Questions connexes