奇怪的字符: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€²N156°36 €²w/20.55°n156.6°w/20.55;-156.6 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€²N157°02€²w/21.133°n157.033°w/21.133;-157.033 6 OÊ»ahu[12]聚集地21°28 €²n 157°59 €²w/21.467°n 157.983°w/21.467;-157.983 7 KauaÊ»i[13]花园岛22°05€²N159°30 €²w/22.083°n159.5°w/22.083;-159.5 8 NiÊ»ihau[14]禁忌之岛
21°54€²n 160°10€²w/21.9°n160.167°w/21.9;-160.167

如你所见,里面有一些"奇怪"的字符。我也试过readHTMLTable(u, encoding = "UTF-16")readHTMLTable(u, encoding = "UTF-8")但那没有用。

在我看来,在字符集和r的Windows设置的交互方面可能有一个问题。

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覆盖窗口设置或可以解决这个问题,否则?我也试过其他网站,每次当要抓取的文本中有、ü、ä、î等字符时,都会出现这个问题。

谢谢你,罗杰

不完全是一个答案:

如果您查看维基百科页面并更改浏览器中的编码(在IE中,查看->编码;在Firefox中,View -> Character Encoding)转换为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", "")

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

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"这样的格式。

我试图复制你的状态

> 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中,"Dutch"可能就足够了。

相关内容

  • 没有找到相关文章

最新更新