2013-11-09 6 views
18

Während R intern gut mit Unicode-Zeichen zu arbeiten scheint, kann ich keinen Datenrahmen in R mit solchen UTF-8 Unicode-Zeichen ausgeben. Gibt es eine Möglichkeit, dies zu erzwingen?Schreibe UTF-8-Dateien aus R

data.frame(c("hīersumian","ǣmettigan"))->test 
write.table(test,"test.txt",row.names=F,col.names=F,quote=F,fileEncoding="UTF-8") 

Die Ausgabetextdatei lautet:

hiersumian <U+01E3>mettigan

Ich bin mit R-Version 3.0.2 in einer Windows-Umgebung (Windows 7).

EDIT


Es ist in den Antworten vorgeschlagen, dass R die Datei korrekt in UTF-8, und dass das Problem liegt bei der Software um die Datei anzuzeigen Ich verwende schreibt. Hier ist ein Code, wo ich alles in R mache. Ich lese in einer Textdatei, die in UTF-8 codiert ist, und R liest sie richtig. Dann schreibt R die Datei in UTF-8 und liest sie wieder ein, und nun sind die korrekten Unicode-Zeichen verschwunden.

read.table("myinputfile.txt",encoding="UTF-8")->myinputfile 
myinputfile[1,1] 
write.table(myinputfile,"myoutputfile.txt",row.names=F,col.names=F,quote=F,fileEncoding="UTF-8") 
read.table("myoutputfile.txt",encoding="UTF-8")->myoutputfile 
myoutputfile[1,1] 

Console Ausgabe:

> read.table("myinputfile.txt",encoding="UTF-8")->myinputfile 
> myinputfile[1,1] 
[1] hīersumian 
Levels: hīersumian ǣmettigan 
> write.table(myinputfile,"myoutputfile.txt",row.names=F,col.names=F,quote=F,fileEncoding="UTF-8") 
> read.table("myoutputfile.txt",encoding="UTF-8")->myoutputfile 
> myoutputfile[1,1] 
[1] <U+FEFF>hiersumian 
Levels: <U+01E3>mettigan <U+FEFF>hiersumian 
> 
+0

Werke für mich (R-devel auf Ubuntu 12.04) beim Betrachten der Datei im Terminal, vi oder emacs. –

+0

@BenBolker Bedeutet dies, dass dieses Problem spezifisch für die Windows-Version von R ist? – Sverre

+1

Zur Verdeutlichung: Dies ist ein Windows-spezifisches Problem. Unter OS X ist das Ergebnis nachweislich korrekt. 'Datei test.txt' antwortet mit' test.txt: UTF-8 Unicode-Text'. Ein Hexdump zeigt die korrekten Bytes an. Gut geschriebene Frage. –

Antwort

7

Diese „Antwort“ dient eher dem Zweck der Klärung, dass es etwas seltsam los hinter den Kulissen:

„hīersumian“ machen nicht einmal es in den Datenrahmen scheint es. Das "ī" -Symbol wird in allen Fällen in "i" umgewandelt.

options("encoding" = "native.enc") 
t1 <- data.frame(a = c("hīersumian "), stringsAsFactors=F) 
t1 
#    a 
# 1 hiersumian 

options("encoding" = "UTF-8") 
t1 <- data.frame(a = c("hīersumian "), stringsAsFactors=F) 
t1 
#    a 
# 1 hiersumian 

options("encoding" = "UTF-16") 
t1 <- data.frame(a = c("hīersumian "), stringsAsFactors=F) 
t1 
#    a 
# 1 hiersumian 

die folgende Sequenz schreibt erfolgreich "ǣmettigan" in die Textdatei:

t2 <- data.frame(a = c("ǣmettigan"), stringsAsFactors=F) 

getOption("encoding") 
# [1] "native.enc" 

Encoding(t2[,"a"]) <- "UTF-16" 

write.table(t2,"test.txt",row.names=F,col.names=F,quote=F) 

enter image description here

Es ist nicht mit "Codierung" als "UTF-8" zur Arbeit gehen oder " UTF-16 "und Angabe von" fileEncoding "führt entweder zu einem Fehler oder zu keiner Ausgabe.

Etwas enttäuschend wie bisher habe ich irgendwie alle Unicode-Probleme behoben.

+0

Während 'write.table' weiterhin fehlschlägt meine Maschine (Ubuntu), die automatische Konvertierung von "hīersumian" scheint in meiner aktuellen Version von R (3.3.2) kein Problem mehr zu sein – MichaelChirico

1

Ich kann etwas OS-spezifische fehlt, aber data.table erscheint dies kein Problem zu haben (oder vielleicht eher es ein Update für R-Interna ist da diese Frage ursprünglich gestellt wurde):

t1 = data.table(a = c("hīersumian", "ǣmettigan")) 
tmp = tempfile() 
fwrite(t1, tmp) 
system(paste('cat', tmp)) 
# a 
# hīersumian 
# ǣmettigan 
fread(tmp) 
#    a 
# 1: hīersumian 
# 2: ǣmettigan 
Verwandte Themen