奇怪的字符: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°/ 19.567°N 155.5°/ 19.567; -155.5 2毛伊岛[8]谷岛20°48“N 156°20”/ 20.8°N 156.333°W / 20.8; -156.333 3卡霍·奥拉韦[9]目标岛20°33'N 156°36°/°C 20.55°N 156.6°/ 20.55°; -156.6 4拉涅我[10]菠萝岛20°50“N 156°56”/ 20.833°N 156.933°/ 20.833; -156.933 5莫洛卡斯我[11]友好小岛21°08'N 157°02'/ 21.133°N 157.033°W / 21.133; -157.033 6 Ohu»ahu [12]集会地点21°28'N 157°59'/ 21.467°N 157.983°W / 21.467; -157.983 7考艾我[13]花园小岛22°05'N 159°30'/ 22.083°N 159.5°/ 22.083; -159.5 8倪志豪[14]故宫
21°54'N 160°10°/ 21.9°N 160.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使用另一个设置,input: 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及其变体,但是这并没有改变任何东西。

我从search网站注意到其他人也有这个问题,但一直没能find解决办法。 我看起来像这是Windows和R如何交互的问题。 不幸的是,我所有的三台电脑都有这个问题。 它出现在WinXP-x32和Win7-x86下。

有没有办法让R覆盖Windows设置,否则可以解决问题? 我也尝试过其他网站,每当有待删除的文本中有“,”,“”等等时,就会出现这个问题。

谢谢罗杰

一个不太确切的答案:

如果你看看维基百科页面,并在浏览器中(在IE浏览器,视图 – >编码;在Firefox中,查看 – >字符编码)更改为西方(ISO-8869-1)或西方(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,您应该使用“英语”或“荷兰_荷兰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中“荷兰语”可能就足够了。