28

尽管 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 环境(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
> 
4

3 回答 3

12

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

"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)

在此处输入图像描述

它不适用于“编码”作为“UTF-8”或“UTF-16”,并且指定“fileEncoding”将导致缺陷或没有输出。

到目前为止,我设法以某种方式解决了所有 Unicode 问题,这有点令人失望。

于 2013-11-20T13:42:28.590 回答
1

我可能遗漏了一些特定于操作系统的东西,但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
于 2017-03-29T15:13:44.373 回答
0

我发现一篇博客文章基本上说明了它的 windows 编码文本的方式。更多细节在帖子中。用户应该使用二进制文件写入文件

writeBin(charToRaw(x), con, endian="little")

https://tomizonor.wordpress.com/2013/04/17/file-utf8-windows/

于 2020-08-27T18:59:49.987 回答