Вывод файла UTF-8 в R

Я использую R 2.15.0 на Windows 7 64-битной. Я хотел бы вывести текст Unicode (CJK) в файл.

В следующем коде показано, как символ Unicode, отправляемый для записи в файловое соединение UTF-8, не работает так, как ожидалось (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, в то время как 2.14.2 на Win7 также не работает. Это где-то на моем конце?]

5 ответов

Решение

Проблема заключается в некотором особом поведении R-Windows (при использовании системного кодирования по умолчанию / или при использовании некоторых функций системной записи; я не знаю специфики, но поведение на самом деле известно)

Для написания текстовой кодировки UTF8 в Windows необходимо использовать useBytes=T параметры в функциях, таких как writeLines или 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/ Kevin Ushey гораздо больше подробностей.

Сохраняет строки 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). Он включает в себя множество функций, обеспечивающих согласованную кроссплатформенную поддержку строк UTF-8 в R. Наиболее важные для этого потока функции stri_read_lines(), stri_read_raw() и stri_write_lines() могут последовательно вводить / выводить UTF-8, даже на Окна.

У меня есть такая проблема со строками UTF-8, которые приходят из БД.

Единственный способ сохранить их правильно - это сохранить файл в двоичном режиме.

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

Я думаю, что у вас есть проблемы, потому что 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] "在"
Другие вопросы по тегам