To nie jest idealna odpowiedź, ale następujące rozwiązanie rozwiązało problem. Starałem się zrozumieć zachowanie lub R, i sprawiają, że przykład tak, że mój skrypt R daje te same wyniki zarówno na Windows i na platformie Linux:
(1) Pobierz dane XML w UTF-8 z Internetu
library(XML)
url <- "http://hydrodata.info/chmi-h/cuahsi_1_1.asmx/GetSiteInfoObject?site=CHMI-H:1263&authToken="
doc <- xmlRoot(xmlTreeParse(url, getDTD=FALSE, useInternalNodes = TRUE))
infoList <- xmlToList(doc[[2]][[1]])
siteName <- infoList$siteName
(2) wydrukować tekst z internetu: Kodowanie UTF-8, wyświetlacz w konsoli R jest również prawidłowe przy użyciu zarówno czeskiej i ustawienia regionalne angielskiego na oknach:
> Sys.getlocale(category="LC_CTYPE")
[1] "English_United States.1252"
> print(siteName)
[1] "Koryčany nad přehradou"
> Encoding(siteName)
[1] "UTF-8"
>
(3) Spróbuj utworzyć i wyświetlić dane.frame. To ma problem. W data.frame nieprawidłowo wyświetla zarówno w widoku RStudio i w konsoli:
df <- data.frame(name=siteName, id=1)
df
name id
1 Korycany nad prehradou 1
(4) Spróbuj użyć zamiast matrycy. Zaskakująco macierz wyświetla się poprawnie w konsoli R.
m <- as.matrix(df)
View(m) #this shows incorrectly in RStudio
m #however, this shows correctly in the R console.
name id
[1,] "Koryčany nad přehradou" "1"
(5) Zmień ustawienia regionalne. Jeśli jestem w systemie Windows, ustaw język na Czeski. Jeśli korzystam z systemu Unix lub Mac, ustaw locale na UTF-8. UWAGA: Ma to pewne problemy, gdy uruchamiam skrypt w RStudio, najwyraźniej RStudio nie zawsze reaguje natychmiast na polecenie Sys.setlocale.
#remember the original locale.
original.locale <- Sys.getlocale(category="LC_CTYPE")
#for Windows set locale to Czech. Otherwise set locale to UTF-8
new.locale <- ifelse(.Platform$OS.type=="windows", "Czech_Czech Republic.1250", "en_US.UTF-8")
Sys.setlocale("LC_CTYPE", new.locale)
(7) Zapisz dane w pliku tekstowym. WAŻNE: nie używaj write.csv
, ale zamiast tego użyj write.table
. Kiedy mój język ustawiony jest na Czech
na moim angielskim Windows, muszę użyć fileEncoding="UTF-8"
w write.table
. Teraz plik tekstowy wyświetla się poprawnie w Notatniku ++, a także w Excelu.
write.table(m, "test-czech-utf8.txt", sep="\t", fileEncoding="UTF-8")
(8) Ustaw locale z powrotem do pierwotnego
Sys.setlocale("LC_CTYPE", original.locale)
(9) Spróbuj odczytać plik tekstowy z powrotem do R. UWAGA: Jeśli czytam plik, musiałem ustawić encoding
parametr (NOT fileEncoding!). Wyświetlacz o data.frame odczytu z pliku jest nadal nieprawidłowa, ale kiedy mój data.frame
konwertować do matrix
Czech UTF-8 znaków są zachowane:
data.from.file <- read.table("test-czech-utf8.txt", sep="\t", encoding="UTF-8")
#the data.frame still has the display problem, "č" and "ř" get "lost"
> data.from.file
name id
1 Korycany nad prehradou 1
#see if a matrix displays correctly: YES it does!
matrix.from.file <- as.matrix(data.from.file)
> matrix.from.file
name id
1 "Koryčany nad přehradou" "1"
Więc lekcja jest to, że trzeba konwertować my data.frame
do , ustaw moje locale na Czech
(w systemie Windows) lub na UTF-8
(na Mac i Linux), zanim napiszę moje dane z czeskimi znakami do pliku.Kiedy piszę ten plik, muszę się upewnić, że fileEncoding
musi być ustawiony na UTF-8. Z drugiej strony, gdy później przeczytałem plik, mogę dalej pracować w języku angielskim, ale w read.table
muszę ustawić encoding="UTF-8"
.
Jeśli ktoś ma lepsze rozwiązanie, przyjmuję Twoje sugestie.
Czy możesz zmienić swoje ustawienia regionalne na CZ i naprawić je w ten sposób? – thelatemail
Częściowe obejście dla mnie to: 'Sys.setLocale (locale =" Czech ")' wyświetla poprawnie dane.frame jako 'Koryčany nad přehradou' w R. Ale teraz kiedy używam' write.csv (df, "test .csv ")' i otwórz plik test.csv w Excelu lub Notatniku, tekst pojawia się jako: 'Koryčany nad pøehradou' w pliku csv. Jedynym sposobem rozwiązania problemu było otwarcie pliku csv w Notepad ++ i zmiana kodowania pliku na Windows-1250. – jirikadlec2
Nie jestem przekonany, że to dokładny duplikat. Inne pytanie wydaje się skupiać na problemie wyświetlania, gdzie wydaje się, że to faktycznie zmienia przechowywanie danych - poprzedni duplikat - http://stackoverflow.com/questions/17715956/why-do-some-unicode-characters -display-in-matrix-ale-nie-danych-frame-in-r? lq = 1 – thelatemail