Запись файлов 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