13

我在 Windows 7 64 位上使用 R 2.15.0。我想将 unicode (CJK) 文本输出到文件中。

以下代码显示了发送以写入 UTF-8 文件连接的 Unicode 字符如何无法按 (I) 预期工作:

rty <- file("test.txt",encoding="UTF-8")
write("在", file=rty)
close(rty)
rty <- file("test.txt",encoding="UTF-8")
scan(rty,what=character())
close(rty)

如scan的输出所示:

Read 1 item 
[1] "<U+5728>"

该文件不是用 UTF 字符本身编写的,而是某种符合 ANSI 的回退。我可以让它第一次正常工作(即使用一个包含“在”的文本文件),还是我可以使用一些额外的魔法将输出转换为 Unicode,并用正确的字符替换代码字符串?

谢谢。

[更多信息:相同的代码在 Cygwin,R 2.14.2 中正常运行,而 Win7 上的 2.14.2 也被破坏。这是在我的尽头吗?]

4

5 回答 5

22

问题是由于一些R-Windows 特殊行为(使用默认系统编码/或使用一些系统写入函数;我不知道具体情况,但行为实际上是已知的)

要在 Windows 上编写文本 UTF8 编码,必须使用useBytes=TwriteLines 或 readLines 等函数中的选项:

txt <- "在"
writeLines(txt, "test.txt", useBytes=T)

readLines("test.txt", encoding="UTF-8")
[1] "在"

在这里可以找到Kevin Ushey写的一篇非常好的文章: http : //kevinushey.github.io/blog/2018/02/21/string-encoding-and-r/更详细。

于 2014-08-26T13:25:42.480 回答
8

在文本文件中保存 UTF-8 字符串:

kLogFileName <- "parser.log"
log <- function(msg="") {
  con <- file(kLogFileName, "a")
  tryCatch({
    cat(iconv(msg, to="UTF-8"), file=con, sep="\n")
  },
  finally = {
    close(con)
  })
}
于 2013-05-05T15:11:58.160 回答
7

对于以后遇到此问题的任何人,请参阅stringi包(https://cran.r-project.org/web/packages/stringi/index.html)。它包括许多函数来在 R 中启用一致的、跨平台的 UTF-8 字符串支持。与这个线程最相关的是stri_read_lines()stri_read_raw()、 和stri_write_lines()函数可以一致地输入/输出 UTF-8,即使在 Windows 上也是如此。

于 2018-05-30T14:23:58.110 回答
0

我认为您遇到了问题,因为write它的构造是使用对象的名称,而您似乎没有构建这样的命名对象。试试这个:

txt <- "在"
rty <- file("test.txt",encoding="UTF-8")
write(txt, file=rty)
close(rty)
rty <- file("test.txt",encoding="UTF-8")
 inp <- scan(rty,what=character())
#Read 1 item
 close(rty)
 inp
#[1] "在"
于 2012-05-20T21:31:45.170 回答
0

我对来自 DB 的 UTF-8 字符串有这样的问题。

我发现正确保存它们的唯一方法是以二进制模式保存文件。

  F <- file(file.name, "wb")
  tryCatch({
    writeBin(charToRaw(the_utf8_str), F)
  },
  finally = { 
    close(F)
  })
于 2013-04-21T10:41:13.857 回答