这不是一个完美的答案,但以下解决方法为我解决了问题。我试图理解 R 的行为,并制作示例,以便我的 R 脚本在 Windows 和 Linux 平台上产生相同的结果:
(1) 从网上获取UTF-8格式的XML数据
library(XML)
url <- "http://hydrodata.info/chmi-h/cuahsi_1_1.asmx/GetSiteInfoObject?site=CHMI-H:1263&authToken="
doc <- xmlRoot(xmlTreeParse(url, getDTD=FALSE, useInternalNodes = TRUE))
infoList <- xmlToList(doc[[2]][[1]])
siteName <- infoList$siteName
(2) 从网上打印出文本:编码为UTF-8,在Windows上使用捷克语和英语语言环境在R控制台中显示也是正确的:
> Sys.getlocale(category="LC_CTYPE")
[1] "English_United States.1252"
> print(siteName)
[1] "Koryčany nad přehradou"
> Encoding(siteName)
[1] "UTF-8"
>
(3) 尝试创建并查看data.frame。这有一个问题。 data.frame 在 RStudio 视图和控制台中显示不正确:
df <- data.frame(name=siteName, id=1)
df
name id
1 Korycany nad prehradou 1
(4)尝试用矩阵代替。令人惊讶的是,矩阵在 R 控制台中正确显示。
m <- as.matrix(df)
View(m) #this shows incorrectly in RStudio
m #however, this shows correctly in the R console.
name id
[1,] "Koryčany nad přehradou" "1"
(5) 更改区域设置。如果我使用的是 Windows,请将区域设置设置为捷克语。如果我使用的是 Unix 或 Mac,请将区域设置设置为 UTF-8。注意:当我在 RStudio 中运行脚本时,这会出现一些问题,显然 RStudio 并不总是立即对 Sys.setlocale 命令做出反应。
#remember the original locale.
original.locale <- Sys.getlocale(category="LC_CTYPE")
#for Windows set locale to Czech. Otherwise set locale to UTF-8
new.locale <- ifelse(.Platform$OS.type=="windows", "Czech_Czech Republic.1250", "en_US.UTF-8")
Sys.setlocale("LC_CTYPE", new.locale)
(7) 将数据写入文本文件。重要提示:不要使用write.csv
但改为使用write.table
。当我的语言环境是Czech
在我的英语 Windows 上,我必须使用fileEncoding="UTF-8"
in the write.table
。现在,文本文件可以在 notepad++ 和 Excel 中正确显示。
write.table(m, "test-czech-utf8.txt", sep="\t", fileEncoding="UTF-8")
(8) 将语言环境设置回原来的语言环境
Sys.setlocale("LC_CTYPE", original.locale)
(9) 尝试将文本文件读回 R。注意:如果我读该文件,我必须设置encoding
参数(不是文件编码!)。从文件读取的 data.frame 的显示仍然不正确,但是当我转换我的data.frame
to a matrix
保留捷克语 UTF-8 字符:
data.from.file <- read.table("test-czech-utf8.txt", sep="\t", encoding="UTF-8")
#the data.frame still has the display problem, "č" and "ř" get "lost"
> data.from.file
name id
1 Korycany nad prehradou 1
#see if a matrix displays correctly: YES it does!
matrix.from.file <- as.matrix(data.from.file)
> matrix.from.file
name id
1 "Koryčany nad přehradou" "1"
所以吸取的教训是我需要改变我的data.frame
to a matrix
,将我的区域设置设置为Czech
(在 Windows 上)或UTF-8
(在 Mac 和 Linux 上)在我将包含捷克语字符的数据写入文件之前。然后当我写入文件时,我必须确保fileEncoding
必须设置为 UTF-8。另一方面,当我稍后阅读该文件时,我可以继续在英语语言环境中工作,但在read.table
我必须设置encoding="UTF-8"
.
如果有人有更好的解决方案,我会欢迎您的建议。