从R列表转换为data.frame时,8个字符会丢失

我在Windows 7 64位上使用R 3.2.0和RStudio 0.98.1103。 我的电脑的Windows“区域和语言设置”是英语(美国)。

由于某些原因,当我从web上以utf-8编码读取XML文件时,以下代码将文本“Koryčanynadpřehradou”中的“c”和“r”替换为捷克文字“č”和“r”,解析将XML文件转换为列表,并将列表转换为data.frame。

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

#this still displays correctly "Koryčany nad přehradou"
print(siteName) 

#make a data.frame from the list item. I suspect here is the problem.
df <- data.frame(name=siteName, id=1)

#now the Czech characters are lost. I see only "Korycany nad prehradou"
View(df) 

write.csv(df,"test.csv")
#the test.csv file also contains "Korycany nad prehradou" 
#instead of "Koryčany nad přehradou"

问题是什么? 如何让R使用所有utf-8特殊字符正确显示data.frame并保存.csv文件而不会丢失捷克语“č”和“ř”字符?


这不是一个完美的答案,但下面的解决方法为我解决了这个问题。 我尝试了解R或R的行为,并创建示例,以便我的R脚本在Windows和Linux平台上产生相同的结果:

(1)从Internet获取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)从Internet上打印文本:编码为UTF-8,在Windows控制台中的显示在Windows上同时使用捷克语和英语语言环境:

> 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在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上,请将locale设置为捷克语。 如果我在Unix或Mac上,请将locale设置为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 。 当我的locale是Czech在我的英文版Windows,我必须使用fileEncoding="UTF-8"write.table 。 现在文本文件在记事本++和Excel中正确显示。

write.table(m, "test-czech-utf8.txt", sep="t", fileEncoding="UTF-8")

(8)将区域设置恢复为原始状态

Sys.setlocale("LC_CTYPE", original.locale)

(9)尝试将文本文件读回R.注意:如果我读取文件,我必须设置encoding参数(NOT fileEncoding!)。 从文件读取的data.frame的显示仍然不正确,但是当我将data.frame转换为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转换为matrix ,在将捷克语字符的数据写入文件之前,将我的语言环境设置为Czech (在Windows上)或UTF-8 (在Mac和Linux上)。 然后,当我写入文件时,我必须确保fileEncoding必须设置为UTF-8。 另一方面,当我稍后阅读文件时,我可以继续在英文语言环境中工作,但在read.table我必须设置encoding="UTF-8"

如果有人有更好的解决方案,我会欢迎你的建议。

链接地址: http://www.djcxy.com/p/84763.html

上一篇: 8 characters get lost when converting from list to data.frame in R

下一篇: GitHub API: Identify the branches that contain a given commit