簡體   English   中英

R中的UTF-8文件輸出

[英]UTF-8 file output in R

我在 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)

如掃描輸出所示:

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

該文件不是用 UTF 字符本身編寫的,而是某種符合 ANSI 的后備。 我可以讓它在第一次正常工作(即使用帶有“在”的文本文件代替),還是可以使用一些額外的魔法將輸出轉換為 Unicode,並使用正確的字符替換代碼字符串?

謝謝。

[更多信息:相同的代碼在 Cygwin、R 2.14.2 中運行正常,而 Win7 上的 2.14.2 也已損壞。 這是在我的盡頭嗎?]

問題是由於某些R-Windows 特殊行為(使用默認系統編碼/或使用某些系統寫入函數;我不知道具體情況但實際上知道行為)

要在 Windows 上編寫文本 UTF8 編碼,必須在 writeLines 或 readLines 等函數中使用useBytes=T選項:

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/詳細介紹。

將 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)
  })
}

對於稍后遇到此問題的任何人,請參閱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,即使在視窗。

我認為您遇到了問題,因為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] "在"

我對來自 DB 的 UTF-8 字符串有這樣的問題。

我發現正確保存它們的唯一方法是以二進制模式保存文件。

  F <- file(file.name, "wb")
  tryCatch({
    writeBin(charToRaw(the_utf8_str), F)
  },
  finally = { 
    close(F)
  })

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM