Запись данных не сохраняет кодировку

У меня есть строка вроде следующего:

str <- "ていただけるなら"
Encoding(str) #returns "UTF-8"

Я пишу его на диск:

write.table(str, file="chartest", quote=F, col.names=F, row.names=F)

Теперь я смотрю на файл в Notepadd ++, который установлен в UTF-8 без кодировки спецификации, и я получаю следующее:

<U+3066><U+3044><U+305F><U+3060><U+3051><U+308B><U+306A><U+3089>

Что происходит в этом процессе? Я хотел бы, чтобы записанный текстовый файл отображал строку, как она появляется в R.

Это в Windows 7, R версии 2.15

Ответ 1

Это раздражающая "функция" R в Windows. Единственное решение, которое я нашел до сих пор, - это временно и программно переключить ваш язык на соответствующий, необходимый для декодирования script данного текста. Итак, в приведенном выше случае вы использовали бы японский язык.

## This won't work on Windows
str <- "ていただけるなら"
Encoding(str) #returns "UTF-8"
write.table(str, file="c:/chartest.txt", quote=F, col.names=F, row.names=F)
## The following should work on Windows - first grab and save your existing locale
print(Sys.getlocale(category = "LC_CTYPE"))
original_ctype <- Sys.getlocale(category = "LC_CTYPE")
## Switch to the appropriate local for the script
Sys.setlocale("LC_CTYPE","japanese")
## Now you can write your text out and have it look as you would expect
write.table(str, "c:/chartest2.txt", quote = FALSE, col.names = FALSE, 
            row.names = FALSE, sep = "\t", fileEncoding = "UTF-8")
## ...and don't forget to switch back
Sys.setlocale("LC_CTYPE", original_ctype)

Вышеприведенные два файла, которые вы видите на этом скриншоте. В первом файле показаны кодовые точки Юникода, который не то, что вы хотите, а второй показывает глифы, которые вы обычно ожидаете.

Japanese text

До сих пор никто не мог объяснить мне, почему это происходит в R. Это не неизбежная особенность Windows, поскольку Perl, как я упоминаю в this post, как-то обходит вопрос.

Ответ 2

Пробовали ли вы использовать аргумент fileEncoding?

write.table(str, file="chartest", quote=F, col.names=F, row.names=F, fileEncoding="UTF-8")