Подтвердить что ты не робот

Странные символы: взаимодействие языка 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 или решить проблему иначе? Я также пробовал другие веб-сайты, и эта проблема возникает каждый раз, когда в тексте, который вы читаете, есть é, ü, ä, î и т.д.

Спасибо, Роджер

4b9b3361

Ответ 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 "голландский", вероятно, достаточно.