Вывод файла 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] "在"