Странные символы: взаимодействие языка R и Windows?
WinXP-x32, R-2.13.0
Дорогой список,
У меня есть проблема, которая (я думаю) связана с взаимодействием между Windows и R.
Я пытаюсь очистить таблицу данными о Гавайских островах. Это мой код R:
library(XML)
u <- "http://en.wikipedia.org/wiki/Hawaii"
tables <- readHTMLTable(u)
Islands <- tables[[5]]
Выход (первый набор столбцов):
Island Nickname > > Islands
Island Nickname > > Location 1 Hawaiʻi[7] The Big
Остров 19 ° 34 "²N 155 ° 30" ²Wï "¿/ ï" À 19.567 ° N 155,5 ° Wï "À/19,567; -155,5 2 Мауи [8] Остров долины 20 ° 48" ²N 156 ° 20" ²Wï "¿/ ï" À 20.8 ° N 156.333 ° Wï" À/20.8; -156.333 3 KahoÊ "olawe [9] Целевой остров 20 ° 33â € ²N 156 ° 36" ²Wï "¿/ï" ¿20,55 ° N 156,6 ° W · "/20,55; -156.6 4 LÄnaÊ" i [10] Остров ананасов 20 ° 50 â € ²N 156 ° 56â € ²Wï "¿/ ï" À 20,833 ° N 156,933 ° Wï "À/20,833; -156.933 5 MolokaÊ" i [11] Дружелюбный остров 21 ° 08 '²N 157 ° 02'2Wï "¿/ï" À 21.133 ° N 157.033 ° Wï "/21.133; -157.033 6 OÊ" ahu [12] The Gathering Place 21 ° 28 "€ 157 ° 59" € Вт "¿/ ï" À 21,467 ° N 157,983 ° Wï "À/21,467; -157.983 7 KauaÊ" i [13] Сад-сад 22 ° 05'2N 159 ° 30 "²Wï "¿/ï" ¿22.083 ° N 159,5 ° W · "/22.083; -159.5 8 NiÊ "ihau [14] Запретный остров
21 ° 54 '²N 160 ° 10" ²Wï "¿/ï" À 21,9 ° N 160.167 ° Wï "/21.9; -160,167
Как видите, там есть "странные" персонажи. Я также пробовал readHTMLTable(u, encoding = "UTF-16")
и readHTMLTable(u, encoding = "UTF-8")
но это не помогло.
Мне кажется, что может возникнуть проблема с взаимодействием настроек Windows набора символов и R.
sessionInfo()
дает
> sessionInfo()
R version 2.13.0 (2011-04-13)
Platform: i386-pc-mingw32/i386 (32-bit)
locale:
[1] LC_COLLATE=Dutch_Netherlands.1252 LC_CTYPE=Dutch_Netherlands.1252 LC_MONETARY=Dutch_Netherlands.1252
[4] LC_NUMERIC=C LC_TIME=Dutch_Netherlands.1252
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] XML_3.2-0.2
Я также попытался позволить R использовать другой параметр, введя: Sys.setlocale("LC_ALL", "en_US.UTF-8")
, но это дает ответ:
> Sys.setlocale("LC_ALL", "en_US.UTF-8")
[1] ""
Warning message:
In Sys.setlocale("LC_ALL", "en_US.UTF-8") :
OS reports request to set locale to "en_US.UTF-8" cannot be honored
Кроме того, я попытался внести изменения непосредственно из командной строки Windows, используя: chcp 65001
и варианты этого, но это ничего не изменило.
Я заметил, что при поиске в Интернете у других есть проблема, но они не смогли найти решение. Похоже, что это проблема взаимодействия Windows и R. К сожалению, все три компьютера в моем распоряжении имеют эту проблему. Это происходит как под WinXP-x32, так и под Win7-x86.
Есть ли способ сделать R переопределить параметры Windows или решить проблему иначе?
Я также пробовал другие веб-сайты, и эта проблема возникает каждый раз, когда в тексте, который вы читаете, есть é, ü, ä, î и т.д.
Спасибо,
Роджер
Ответы
Ответ 1
Не совсем ответ:
Если вы посмотрите на страницу wikipedia и измените кодировку в своем браузере (в IE, View → Encoding, в Firefox, View → Кодировка символов) на Western (ISO-8869-1) или Western (Windows-1252), тогда вы видите глупых персонажей. Это должно означать, что вы можете использовать iconv
для изменения кодировки и устранения ваших проблем.
#Convert factors to character
Islands <- as.data.frame(lapply(Islands, as.character), stringsAsFactors = FALSE)
iconv(Islands$Island, "windows-1252", "UTF-8")
К сожалению, он не работает. Возможно получить правильный текст, используя другое преобразование (iconvlist()
показывает все возможности).
Возможно, он просто вычеркивает нарушающие символы, хотя это не идеально.
iconv(Islands$Island, "windows-1252", "ASCII", "")
Ответ 2
Невозможно реплицировать ошибку, однако полезно использовать файлы справки.
Sys.setlocale("LC_TIME", "de") # Solaris: details are OS-dependent
Sys.setlocale("LC_TIME", "de_DE.utf8") # Modern Linux etc.
Sys.setlocale("LC_TIME", "de_DE.UTF-8") # ditto
Sys.setlocale("LC_TIME", "de_DE") # OS X, in UTF-8
Sys.setlocale("LC_TIME", "German") # Windows
Для окон вы должны использовать форматирование, например "Английский" или "Dutch_Netherlands.1252", чтобы изменить эти параметры.
Я попытался воспроизвести ваше состояние
> Sys.setlocale("LC_ALL","Dutch_Netherlands.1252")
[1] "LC_COLLATE=Dutch_Netherlands.1252;LC_CTYPE=Dutch_Netherlands.1252;LC_MONETARY=Dutch_Netherlands.1252;LC_NUMERIC=C;LC_TIME=Dutch_Netherlands.1252"
> Sys.getlocale()
[1] "LC_COLLATE=Dutch_Netherlands.1252;LC_CTYPE=Dutch_Netherlands.1252;LC_MONETARY=Dutch_Netherlands.1252;LC_NUMERIC=C;LC_TIME=Dutch_Netherlands.1252"
library(XML)
u <- "http://en.wikipedia.org/wiki/Hawaii"
tables <- readHTMLTable(u)
Islands <- tables[[5]]
Однако я не получаю забавные символы в консоли, в моей собственной локали "отмечен как", но все же осталась функциональность.
> Islands[1,1]
[1] Hawaiʻi[27]
8 Levels: Hawaiʻi[27] Kahoʻolawe[34] Kauaʻi[30] Lānaʻi[32] Maui[28] ... Oʻahu[29]
И эти забавные символы можно легко прочитать и найти из таблицы.
> Encoding(as.character("Hawaiʻi"))
[1] "UTF-8"
> Encoding(as.character(Islands[1,1]))
[1] "UTF-8"
> grep("Hawaiʻi", as.character(Islands[1,1]))
[1] 1
Если у вас все еще есть проблемы, он будет полагаться на другие места, однако, чтобы изменить локаль под окнами, вы должны использовать разные имена, чем Linux или OS X (например, см. вашу собственную информацию о локали). В Windows "голландский", вероятно, достаточно.