【问题标题】:Write UTF-8 files from R从 R 写入 UTF-8 文件
【发布时间】:2013-11-21 13:29:15
【问题描述】:

虽然 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
> 

【问题讨论】:

  • 在终端、vi 或 emacs 中查看文件时适用于我(Ubuntu 12.04 上的 R-devel)。
  • @BenBolker 这是否意味着这个问题是特定于 Windows 版本的 R 的?
  • 澄清一下:这是一个特定于 Windows 的问题。在 OS X 上,结果可验证是正确的。 file test.txt 回复 test.txt: UTF-8 Unicode text。 hexdump 显示正确的字节。不过问题写得很好。
  • 说这是 Windows 的 R 版本特有的问题不是更正确吗(R 存在不同的版本,具体取决于操作系统)?否则我在 Windows 中使用 UTF-8 和 Unicode 没有任何问题,所以我怀疑问题出在 Windows 上。
  • 我已向 R-devel 邮件列表提交了一个请求,希望在未来的 R for Windows 版本中正确支持 UTF-8。

标签: windows r unicode utf-8


【解决方案1】:

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

“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 问题,这有点令人失望。

【讨论】:

  • 虽然 write.table 在我的机器 (Ubuntu) 上似乎仍然失败,但 "hīersumian" 的自动转换在我当前版本的 R (3.3.2) 中似乎不再是问题跨度>
【解决方案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

【讨论】:

    【解决方案3】:

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

    将文件写入二进制文件

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-09
      • 2010-10-30
      • 1970-01-01
      相关资源
      最近更新 更多