R中的UTF-8文件输出

Pat*_*ick 11 unicode r cjk

我在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)
Run Code Online (Sandbox Code Playgroud)

如扫描输出所示:

Read 1 item 
[1] "<U+5728>"
Run Code Online (Sandbox Code Playgroud)

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

谢谢.

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

pet*_*ner 14

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

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

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

readLines("test.txt", encoding="UTF-8")
[1] "?"
Run Code Online (Sandbox Code Playgroud)

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


bel*_*kiy 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)
  })
}
Run Code Online (Sandbox Code Playgroud)


小智 6

对于稍后遇到此问题的任何人,请参阅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上。