2012-05-20 31 views
8

Używam wersji 2.15.0 w systemie Windows 7 w wersji 64-bitowej. Chciałbym wypisać tekst Unicode (CJK) do pliku.Plik wyjściowy pliku UTF-8 w R

Poniższy kod pokazuje jak Unicode wysyłane pisać na UTF-8 połączenia plików nie działa jak (I) oczekuje:

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) 

Jak pokazano przez wyjście skanowania:

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

Plik nie został napisany z samym znakiem UTF, ale z pewnym zastępczym zgodnym z ANSI. Czy mogę sprawić, aby działał poprawnie za pierwszym razem (tzn. Z plikiem tekstowym, który zamiast tego zawiera "在"), czy mogę wykonać dodatkową magię, aby przekonwertować wyjście do Unicode z odpowiednim znakiem zastępującym ciąg znaków?

Dzięki.

[Więcej informacji: ten sam kod zachowuje się odpowiednio w Cygwin, R 2.14.2, a 2.14.2 na Win7 również jest uszkodzony. Jest to na moim końcu gdzieś?]

+0

[Aktualizacja z opóźnieniem] Problemy dotyczą raczej * locale * niż kodowania. Rozwiązałem problemy z błędami wyjściowymi, tymczasowo zmieniając ustawienia narodowe na "odpowiednie". Boże, pomóżcie, jeśli macie dane językowe z więcej niż jednego języka. – Patrick

+0

Może to [post] (http://stackoverflow.com/questions/11069908/r-extracting-clean-utf-8-text-from-a-web-page-scraped-w-rcurl?lq=1) Wsparcie. – DJJ

Odpowiedz

8

Zapisuje UTF-8 ciągi w pliku tekstowego:

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

Czy to pęknięcie w nowszych wersjach R? Kiedy piszę pliki w ten sposób, nadal muszę ustawić parametr kodowania readLines na "ANSI", aby uzyskać poprawną zawartość pliku. Przykładem jest "à" wychodzenie jako "\ xe0" pod kodowaniem UTF-8, ale poprawnie pod kodowaniem ANSI przy użyciu readLines pliku utworzonego – dimpol

+0

@dimpol - czy to działało dla ciebie na końcu? – Curious

+0

@Curious - Nie, w końcu zrobiłem to ręcznie za pomocą notatnika ++.Musiałem zrobić to tylko raz dla plików w jednym zbiorze danych i było to szybsze tylko po to, aby ugryźć bullet i zrobić to ręcznie, aby dalej bawić się z kodowaniem plików R. – dimpol

0

myślę, że mają problemy z powodu write jest tak skonstruowana, że ​​ma nazwę obiektu i nie wydaje się mieć zbudować takiej nazwie obiektu. Spróbuj tego zamiast:

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, oryginalna aplikacja, która zainspirowała minimalny fragment powyżej, użył nazwanych obiektów. Ponadto kod podany powyżej daje taki sam wynik jak dla mnie. Być może mam problem z natywnym kodowaniem? – Patrick

0

Mam taki problem z ciągami UTF-8, które pochodzą z DB.

Jedynym sposobem, jaki udało mi się zapisać, to zapisanie pliku w trybie binarnym.

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

Problem jest ze względu na niektóre R-Okna specjalny zachowanie (przy użyciu kodowania domyślnego systemu/lub za pomocą jakiegoś zapisu systemu funkcje, nie znam szczegółów, ale zachowanie jest faktycznie znane)

Aby napisać kodowanie UTF8 w systemie Windows, należy użyć opcji useBytes=T w funkcjach li ke writeLines lub readLines:

txt <- "在" 
writeLines(txt, "test.txt", useBytes=T) 

readLines("test.txt", encoding="UTF-8") 
[1] "在" 
+0

Dzięki! To działało dla mnie. Mnóstwo niekompletnych porad tam. – Ruben

Powiązane problemy