Rは内部的にUnicode文字を適切に処理しているようですが、このようなUTF-8 Unicode文字を使用してRでデータフレームを出力することはできません。これを強制する方法はありますか?
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
Windows環境(Windows 7)でRバージョン3.0.2を使用しています。
[〜#〜]編集[〜#〜]
回答では、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
>
この「答え」は、裏で何か奇妙なことが起こっていることを明確にする目的を果たしています。
"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)
「エンコーディング」を「UTF-8」または「UTF-16」として使用することはできません。また、「fileEncoding」を指定すると、不具合が発生するか、出力されません。
これまでのところ、少し残念なことに、なんとかしてすべてのUnicodeの問題を修正することができました。
OS固有の機能がない場合がありますが、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