2012-05-20 5 views
8

Ich verwende R 2.15.0 unter Windows 7 64-Bit. Ich möchte Unicode (CJK) Text in eine Datei ausgeben.UTF-8-Dateiausgabe in R

Der folgende Code zeigt, wie ein Unicode-Zeichen auf einer UTF-8-Datei Verbindung schreiben gesendet, wie nicht arbeitet (I) erwartet:

rty <- file("test.txt",encoding="UTF-8") 
write("在", file=rty) 
close(rty) 
rty <- file("test.txt",encoding="UTF-8") 
scan(rty,what=character()) 
close(rty) 

wie durch den Ausgang des Scan gezeigt:

Read 1 item 
[1] "<U+5728>" 

Die Datei wurde nicht mit dem UTF-Zeichen selbst geschrieben, sondern mit einer Art ANSI-konformem Fallback. Kann ich es beim ersten Mal richtig machen lassen (d. H. Mit einer Textdatei, die stattdessen "在" enthält), oder kann ich zusätzliche Magie anwenden, um die Ausgabe in Unicode zu konvertieren, wobei das richtige Zeichen die Codezeichenfolge ersetzt?

Danke.

[Weitere Informationen: der gleiche Code verhält sich richtig in Cygwin, R 2.14.2, während 2.14.2 auf Win7 ist auch gebrochen. Ist das an meinem Ende irgendwo?]

+0

[Verspätete Aktualisierung] Die Probleme neigen dazu, mit * locale * statt Codierung zu sein. Ich habe Kauderwelschprobleme behoben, indem ich das Gebietsschema vorübergehend in etwas "Angemessenes" änderte. Gott helfe dir, wenn du Sprachdaten von mehr als einem Ort hast. – Patrick

+0

vielleicht wird dies [Post] (http://stackoverflow.com/questions/11069908/r-extracting-clean-utf-8-text-from-a-web-page-scraped-with-rcurl?lq=1) werden Hilfe. – DJJ

Antwort

8

Speichert UTF-8-Strings in Textdatei:

kLogFileName <- "parser.log" 
log <- function(msg="") { 
    con <- file(kLogFileName, "a") 
    tryCatch({ 
    cat(iconv(msg, to="UTF-8"), file=con, sep="\n") 
    }, 
    finally = { 
    close(con) 
    }) 
} 
+0

Hat dies in neueren R-Versionen geendet? Wenn ich Dateien auf diese Weise schreibe, muss ich den encoding-Parameter von readLines auf "ANSI" setzen, um den korrekten Dateiinhalt zu erhalten. Ein Beispiel ist "à" als "\ xe0" unter UTF-8-Codierung, aber korrekt unter ANSI-Codierung, wenn Sie readLines der Datei – dimpol

+0

@dimpol erstellt - hat dies am Ende für Sie funktioniert? – Curious

+0

@Curious - Nein, ich habe es manuell mit Notepad ++ getan.Ich musste es nur einmal für die Dateien in einem Datensatz tun, und es war schneller, nur die Kugel zu beißen und es manuell zu machen, um dann mit R-Datei-Codierungen herumzuhantieren. – dimpol

0

Ich denke, Sie Probleme haben, weil write ist so konstruiert, dass sie den Name Objekt eines dauert und Sie scheinen nicht ein benanntes Objekt zu haben, bauen solche. Versuchen Sie dies stattdessen:

txt <- "在" 
rty <- file("test.txt",encoding="UTF-8") 
write(txt, file=rty) 
close(rty) 
rty <- file("test.txt",encoding="UTF-8") 
inp <- scan(rty,what=character()) 
#Read 1 item 
close(rty) 
inp 
#[1] "在" 
+0

Hm, die ursprüngliche Anwendung, die das oben erwähnte Minimal-Snippet inspirierte, benannte Objekte. Außerdem liefert der oben angegebene Code für mich das gleiche Ergebnis wie oben. Vielleicht habe ich ein natives Kodierungsproblem? – Patrick

0

Ich habe ein solches Problem mit UTF-8-Strings, die von DB kommen.

Die einzige Möglichkeit, sie zu speichern, ist das Speichern der Datei im Binärmodus.

F <- file(file.name, "wb") 
    tryCatch({ 
    writeBin(charToRaw(the_utf8_str), F) 
    }, 
    finally = { 
    close(F) 
    }) 
9

Das Problem ist aufgrund einiger R-Windows-Sonder Verhalten (mit der Standardkodierung/oder ein System Schreib mit Funktionen: Ich weiß nicht die Besonderheiten, aber das Verhalten ist eigentlich bekannt)

Um Text UTF8 Codierung unter Windows zu schreiben, muss man die useBytes=T Optionen in Funktionen li verwenden ke writeLines oder readLines:

+0

Danke! Das hat für mich funktioniert. Viele unvollständige Ratschläge da draußen. – Ruben