2012-06-27 4 views
11

mam ciąg jak poniżej:zapisywania danych nie jest konserwowanie kodowanie

str <- "ていただけるなら" 
Encoding(str) #returns "UTF-8" 

piszę go na dysku:

write.table(str, file="chartest", quote=F, col.names=F, row.names=F) 

Teraz patrzę na plik w Notepadd ++, który jest ustawiony do UTF-8 bez kodowania BOM, a otrzymuję:

<U+3066><U+3044><U+305F><U+3060><U+3051><U+308B><U+306A><U+3089> 

Co dzieje się w tym procesie? Chciałbym pisemnej plik tekstowy, aby wyświetlić napis zamieszczony w R.

to na Windows 7 w wersji R 2,15

Odpowiedz

1

Czy próbowali za pomocą argumentu fileEncoding?

write.table(str, file="chartest", quote=F, col.names=F, row.names=F, fileEncoding="UTF-8") 
+1

Dzięki za sugestię. Wydaje się, że to nie działa. – qua

+0

OK więc w tym czasie próbowałem na moim komputerze roboczym (na Mac OSX) i działało, ale od tego czasu próbowałem na moim komputerze domowym (Windows 7) i tak się nie stało. – plannapus

13

Jest to irytująca "funkcja" R w systemie Windows. Jedyne rozwiązanie, które dotychczas odkryłem, to tymczasowe i programowe przełączenie ustawień regionalnych na odpowiednie, wymagane do dekodowania skryptu danego tekstu. Tak więc w powyższym przypadku używałbyś japońskiego locale.

## This won't work on Windows 
str <- "ていただけるなら" 
Encoding(str) #returns "UTF-8" 
write.table(str, file="c:/chartest.txt", quote=F, col.names=F, row.names=F) 
## The following should work on Windows - first grab and save your existing locale 
print(Sys.getlocale(category = "LC_CTYPE")) 
original_ctype <- Sys.getlocale(category = "LC_CTYPE") 
## Switch to the appropriate local for the script 
Sys.setlocale("LC_CTYPE","japanese") 
## Now you can write your text out and have it look as you would expect 
write.table(str, "c:/chartest2.txt", quote = FALSE, col.names = FALSE, 
      row.names = FALSE, sep = "\t", fileEncoding = "UTF-8") 
## ...and don't forget to switch back 
Sys.setlocale("LC_CTYPE", original_ctype) 

Powyższe tworzy dwa pliki widoczne na tym zrzucie ekranu. Pierwszy plik pokazuje punkty kodu Unicode, które nie są tym, czego potrzebujesz, a drugi pokazuje glify, których normalnie oczekujesz.

Japanese text

Do tej pory nikt nie był w stanie mi wyjaśnić, dlaczego tak się dzieje w R. To nie jest nieuniknionym elementem systemu Windows, ponieważ Perl, jak wspominam w this postu, dostaje się wokół kwestii jakoś.

+0

Dzięki za odpowiedź. Japończyk był tylko przykładem, chciałbym czegoś, co działa na wszystkie typy języków. Nie brzmi to jednak obiecująco. – qua

+0

@qua - Tak, pomyślałem, że może to być losowy przykład, biorąc pod uwagę, że złamałeś japoński ciąg w raczej dziwnym miejscu. Niestety w tym momencie nie wydaje mi się, że istnieje lepsze rozwiązanie dla R, ale proszę, utwórz własną odpowiedź na to pytanie, jeśli ją znajdziesz! Zgadzam się, że jeśli nie znasz skryptu wcześniej, możesz zmagać się z moim podejściem, ponieważ (między innymi) będzie wymagało odgadnięcia przy użyciu skryptu i po prostu nie ma pewnej metody ustalania typu kodowania. – SlowLearner

+0

@SlowLearner Czy istnieje sposób na wylistowanie wszystkich poprawnych wartości dla LC_CTYPE? – panterasBox