Запись файлов UTF-8 из R

В то время как R, похоже, хорошо работает с символами Юникода, я не могу выводить кадр данных в R с такими символами Юникода UTF-8. Есть ли способ заставить это?

data.frame(c("hīersumian","ǣmettigan"))->test
write.table(test,"test.txt",row.names=F,col.names=F,quote=F,fileEncoding="UTF-8")

Выходной текстовый файл читает:

hiersumian <U+01E3>mettigan

Я использую R версии 3.0.2 в среде Windows (Windows 7).

ИЗМЕНИТЬ


В ответах было предложено, что R правильно записывает файл в UTF-8 и что проблема связана с программным обеспечением, которое я использую для просмотра файла. Здесь некоторый код, где я делаю все в R. Я читаю текстовый файл, закодированный в UTF-8, и R читает его правильно. Затем R записывает файл в UTF-8 и снова считывает его обратно, и теперь правильные символы Unicode исчезли.

read.table("myinputfile.txt",encoding="UTF-8")->myinputfile
myinputfile[1,1]
write.table(myinputfile,"myoutputfile.txt",row.names=F,col.names=F,quote=F,fileEncoding="UTF-8")
read.table("myoutputfile.txt",encoding="UTF-8")->myoutputfile
myoutputfile[1,1]

Выход консоли:

> read.table("myinputfile.txt",encoding="UTF-8")->myinputfile
> myinputfile[1,1]
[1] hīersumian
Levels: hīersumian ǣmettigan
> write.table(myinputfile,"myoutputfile.txt",row.names=F,col.names=F,quote=F,fileEncoding="UTF-8")
> read.table("myoutputfile.txt",encoding="UTF-8")->myoutputfile
> myoutputfile[1,1]
[1] <U+FEFF>hiersumian
Levels: <U+01E3>mettigan <U+FEFF>hiersumian
> 

Ответы

Ответ 1

Этот "ответ" служит скорее целью разъяснить, что за сценой происходит что-то странное:

"hīersumian" даже не попадает в структуру данных. Символ "ī" во всех случаях преобразуется в "i".

options("encoding" = "native.enc")
t1 <- data.frame(a = c("hīersumian "), stringsAsFactors=F)
t1
#             a
# 1 hiersumian 

options("encoding" = "UTF-8")
t1 <- data.frame(a = c("hīersumian "), stringsAsFactors=F)
t1
#             a
# 1 hiersumian 

options("encoding" = "UTF-16")
t1 <- data.frame(a = c("hīersumian "), stringsAsFactors=F)
t1
#             a
# 1 hiersumian 

Следующая последовательность успешно записывает "ǣmettigan" в текстовый файл:

t2 <- data.frame(a = c("ǣmettigan"), stringsAsFactors=F)

getOption("encoding")
# [1] "native.enc"

Encoding(t2[,"a"]) <- "UTF-16"

write.table(t2,"test.txt",row.names=F,col.names=F,quote=F)

enter image description here

Он не будет работать с "кодировкой" как "UTF-8" или "UTF-16", а также с указанием "fileEncoding" приведет либо к дефекту, либо к отсутствию вывода.

Несколько разочаровывает, так как до сих пор мне удалось как-то устранить все проблемы Юникода.

Ответ 2

Возможно, мне не хватает чего-то определенного для ОС, но data.table, похоже, не имеет проблем с этим (или, возможно, более вероятно, что это обновление для внутренних элементов R, поскольку этот вопрос был первоначально поставлен):

t1 = data.table(a = c("hīersumian", "ǣmettigan"))
tmp = tempfile()
fwrite(t1, tmp)
system(paste('cat', tmp))
# a
# hīersumian
# ǣmettigan
fread(tmp)
#             a
# 1: hīersumian
# 2:  ǣmettigan