使用R语言编写UTF-8文件

30

虽然R在内部处理Unicode字符表现良好,但我无法在R中导出带有UTF-8 Unicode字符的数据框。是否有强制执行此操作的方法?

data.frame(c("hīersumian","ǣmettigan"))->test
write.table(test,"test.txt",row.names=F,col.names=F,quote=F,fileEncoding="UTF-8")

输出的文本文件内容为:

hiersumian <U+01E3>mettigan

我在Windows 7环境下使用R版本3.0.2。

编辑


答案中有人建议R以UTF-8格式正确地写入了该文件,问题可能出现在我用来查看文件的软件上。这里提供一些我在R中编写的代码。我正在读入一个以UTF-8编码的文本文件,R可以正确地读取它。然后R以UTF-8格式将文件写出并重新读入,此时正确的Unicode字符就消失了。

read.table("myinputfile.txt",encoding="UTF-8")->myinputfile
myinputfile[1,1]
write.table(myinputfile,"myoutputfile.txt",row.names=F,col.names=F,quote=F,fileEncoding="UTF-8")
read.table("myoutputfile.txt",encoding="UTF-8")->myoutputfile
myoutputfile[1,1]

控制台输出:

> read.table("myinputfile.txt",encoding="UTF-8")->myinputfile
> myinputfile[1,1]
[1] hīersumian
Levels: hīersumian ǣmettigan
> write.table(myinputfile,"myoutputfile.txt",row.names=F,col.names=F,quote=F,fileEncoding="UTF-8")
> read.table("myoutputfile.txt",encoding="UTF-8")->myoutputfile
> myoutputfile[1,1]
[1] <U+FEFF>hiersumian
Levels: <U+01E3>mettigan <U+FEFF>hiersumian
> 

当我在终端、vi或emacs中查看文件时,它在我的Ubuntu 12.04上的R-devel版本中运行良好。 - Ben Bolker
1
@BenBolker 这是否意味着这个问题只出现在 Windows 版本的 R 中? - Sverre
3
需要澄清的是:这是一个特定于Windows的问题。在OS X上,结果是可以验证正确的。输入file test.txt会显示test.txt: UTF-8 Unicode text。十六进制转储显示出了正确的字节。问题写得很好。 - Konrad Rudolph
3
这不是说在Windows R版本中存在特定问题更准确吗?(根据操作系统,R有不同的版本)否则我在Windows上使用UTF-8和Unicode时没有任何问题,所以我怀疑问题不在于Windows。 - Sverre
既然你在r-devel(http://article.gmane.org/gmane.comp.lang.r.devel/34861)上得到了冷淡的回应,我想这里的答案可以集中于解决方法。 - Ben Bolker
显示剩余2条评论
3个回答

15

这个“答案”的目的在于澄清幕后发生了一些奇怪的事情:

似乎“hīersumian”甚至没有出现在数据框中。在所有情况下,“ī”符号都被转换为“i”。

options("encoding" = "native.enc")
t1 <- data.frame(a = c("hīersumian "), stringsAsFactors=F)
t1
#             a
# 1 hiersumian 

options("encoding" = "UTF-8")
t1 <- data.frame(a = c("hīersumian "), stringsAsFactors=F)
t1
#             a
# 1 hiersumian 

options("encoding" = "UTF-16")
t1 <- data.frame(a = c("hīersumian "), stringsAsFactors=F)
t1
#             a
# 1 hiersumian 
下面的代码序列成功地将"ǣmettigan"写入文本文件:
t2 <- data.frame(a = c("ǣmettigan"), stringsAsFactors=F)

getOption("encoding")
# [1] "native.enc"

Encoding(t2[,"a"]) <- "UTF-16"

write.table(t2,"test.txt",row.names=F,col.names=F,quote=F)

enter image description here

使用“UTF-8”或“UTF-16”作为“encoding”,并指定“fileEncoding”将导致缺陷或无输出。

有点令人失望,因为到目前为止我设法解决了所有Unicode问题。


尽管 write.table 在我的机器上(Ubuntu)仍然似乎失败了,但是在我的当前版本的 R(3.3.2)中,“hīersumian”的自动转换似乎不再是一个问题。 - MichaelChirico

2
我可能在特定于操作系统的某些方面上缺失了信息,但是 data.table 似乎对此没有问题(或者更有可能的是自从最初提出这个问题以来 R 内部已经更新):
t1 = data.table(a = c("hīersumian", "ǣmettigan"))
tmp = tempfile()
fwrite(t1, tmp)
system(paste('cat', tmp))
# a
# hīersumian
# ǣmettigan
fread(tmp)
#             a
# 1: hīersumian
# 2:  ǣmettigan

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接