【问题标题】:strange characters: interaction of R and Windows locale?奇怪的字符:R 和 Windows 语言环境的交互?
【发布时间】:2011-05-04 10:07:44
【问题描述】:

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 Isle 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′W / 21.133â°N 157.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′N 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") 但这没有帮助。

在我看来,字符集和 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

我还尝试通过输入: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 覆盖 Windows 设置,或者问题可以通过其他方式解决吗? 我也试过其他网站,每次要刮的文字里有é、ü、ä、î等时都会出现这个问题。

谢谢你, 罗杰

【问题讨论】:

  • 发帖,为 Ripley 教授 +1:stat.ethz.ch/pipermail/r-help/2011-May/277057.html
  • 奇怪。我运行的是 Windows 7(64 位),您的代码在我的机器上运行良好。
  • 只是在黑暗中拍摄:Set.setlocale 的文档建议更改会话中的编码可能会被忽略且不推荐。您可以尝试从命令行启动 R 并声明编码为here

标签: windows r localization locale


【解决方案1】:

一个不完全的答案:

如果您查看维基百科页面并将浏览器中的编码(在 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", "")

【讨论】:

  • 我认为这可能是一个正确的答案。我会猜到第一个参数是“从”,第二个是“到”,为什么不呢:iconv(Islands, "UTF-8", "windows-1252")?
【解决方案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

对于 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 中,“荷兰语”可能就足够了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-09
    • 1970-01-01
    • 1970-01-01
    • 2019-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多