奇怪的字符:R和Windows语言环境的交互?

时间:2011-05-04 10:07:44

标签: windows r localization locale

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 Maui [8] The Valley Isle20°48°N 156°20°W/   ï»¿20.8°N 156.333°W/ 20.8;   -156.3333KahoÊ»olawe [9]目标岛20°33°N   156°36°W/20.55°N   156.6°W/ 20.55; -156.64LÄnaÊ»i [10]菠萝岛   20°50°N 156°56°W/   ï»¿20.833°N 156.933°W/ 20.833;   -156.9335MolokaÊ»i [11]友好岛屿21°08°N   157°02°W/21.133°N   157.033°W/ 21.133; -157.033 6Ê»ahu [12]聚会场所   21°28°N 157°59°W/   ï»¿21.467°N 157.983°W/ 21.467;   -157.983 7KauaÊ»i [13]花园小岛22°05°N   159°30°W/22.083°N   159.5°W/ 22.083; -159.5 8NiÊ»ihau [14] The Forbidden Isle
  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

我还试图通过输入:Sys.setlocale("LC_ALL", "en_US.UTF-8")让R使用其他设置,但这会产生响应:

> 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覆盖窗口设置,否则问题可以解决? 我也尝试过其他网站,每当有待删除的文本中有é,ü,ä,î等等时就会出现问题。

谢谢你, 罗杰

2 个答案:

答案 0 :(得分:1)

答案不是很好:

如果您查看维基百科页面并将浏览器中的编码(在IE中,查看 - &gt;编码;在Firefox中,查看 - &gt;字符编码)更改为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", "")

答案 1 :(得分:0)

无法复制错误,但查看帮助文件很有用。

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

对于Windows,您应该使用“English”或“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

如果你仍然有问题,它会依赖其他地方,但是要更改windows下的语言环境,你必须使用与Linux或OS X不同的名称(例如,参见你自己的语言环境信息)。在Windows中,“荷兰语”可能就足够了。