Вопрос по r, cjk, unicode – Вывод файла UTF-8 в R

9

Я использую R 2.15.0 в Windows 7 64-bit. Я хотел бы вывести текст 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-совместимым отступлением. Могу ли я заставить его работать правильно с первого раза (т. Е. С текстовым файлом, в котором вместо этого есть «& # x5728;»), или я могу применить дополнительную магию, чтобы преобразовать вывод в Unicode с соответствующим символом, заменяющим код строка?

Благодарю.

[Больше информации: тот же код ведет себяproperly в Cygwin R 2.14.2, в то время как 2.14.2 на Win7 также не работает. Это где-то на моем конце?]

[Запоздалое обновление] Проблемы, как правило, сlocale а не кодирование. Я решил бредовые проблемы с выходом, временно изменив локаль на что-то "подходящее". Да поможет вам Бог, если у вас есть языковые данные из нескольких языков. Patrick
Может быть, этоpost поможет. DJJ

Ваш Ответ

5   ответов
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)
  })
}
Это сломалось в более поздних версиях R? Когда я пишу файлы таким образом, мне все равно приходится устанавливать параметр кодировки readLines на «ANSI». чтобы получить правильное содержимое файла. Примером является & quot; & xE0; & quot; выходящий как & quot; \ xe0 & quot; в кодировке UTF-8, но правильно в кодировке ANSI при использовании readLines созданного файла
@ Любопытно - нет, я закончил делать это вручную, используя блокнот ++. Мне нужно было сделать это только один раз для файлов в одном наборе данных, и это было быстрее, просто откусить пулю и сделать это вручную, чтобы потом не связываться с R-кодировками.
@dimpol - это сработало для тебя в конце?
1

кто сталкивается с этим вопросом позже, посмотрите пакет 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, даже на Окна.

12

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

Для написания текстовой кодировки UTF8 в Windows необходимо использоватьuseBytes=T параметры в функциях, таких как writeLines или readLines:

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

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

Найдите здесь действительно хорошо написанную статьюКевин Ушей: http://kevinushey.github.io/blog/2018/02/21/string-encoding-and-r/ вдаваясь в гораздо более подробно.

Спасибо! Это сработало для меня. Много неполных советов там.
0

write построен так, что он принимаетname объекта, и вы, кажется, не построить такой именованный объект. Попробуйте это вместо:

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] "在"
Хм, оригинальное приложение, которое вдохновило минимальный фрагмент выше, использовало именованные объекты. Более того, приведенный выше код дает для меня тот же результат, что и выше. Возможно, у меня есть проблема с кодировкой? Patrick
0

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

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

Похожие вопросы