2012-05-20 2 views
8

Windows 7 64ビット版でR 2.15.0を使用しています。私はunicode(CJK)テキストをファイルに出力したいと思います。UTF-8ファイル出力:R

次のコードは、Unicode文字のように動作しないUTF-8ファイル接続上の書き込みに送られた方法を示し予想(I):

Read 1 item 
[1] "<U+5728>" 

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) 

スキャンの出力で示されているように

ファイルはUTF文字自体ではなく、ANSI準拠のフォールバックなどの形式で書き込まれています。最初に正しく動作させることができますか(代わりに「在」というテキストファイルを使用しています)、またはコード文字列を置き換える適切な文字で出力をUnicodeに変換するために余分な魔法を働かせることはできますか?

ありがとうございました。

[詳細情報:同じコードがを正しく実行します。Win7の2.14.2も、Cygwin、R 2.14.2ではが壊れています。これはどこかで私の端にある?]

+0

[最新の更新]問題は、エンコードではなく*ロケール*である傾向があります。ロケールを一時的に「適切なもの」に変更することで、不安定な出力問題を解決しました。複数のロケールからの言語データがある場合、神はあなたを助けます。 – Patrick

+0

多分この[投稿](http://stackoverflow.com/questions/11069908/r-extracting-clean-utf-8-text-from-a-web-page-scraped-with-rcurl?lq=1)助けて。 – DJJ

答えて

8

は、テキストファイル内のUTF-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) 
    }) 
} 
+0

最近のRのバージョンではこれが壊れましたか?このようにファイルを書き込む際には、readLinesのエンコーディングパラメータを "ANSI"に設定して、正しいファイルの内容を取得する必要があります。例はUTF-8エンコーディングで "\ xe0"として出力されますが、作成されたファイルのreadLinesを使用している場合はANSIエンコーディングで正しく表示されます – dimpol

+0

@dimpol - 最後にこの機能を使用しましたか? – Curious

+0

@Curious - いいえ、私はnotepad ++を使って手動でやりました。私は1つのデータセット内のファイルに対してこれを一度行う必要がありました。弾丸を噛んで手作業で行い、Rファイルのエンコーディングを乱してしまった方が速かったです。 – dimpol

0

私はそれがオブジェクトの名前を取り、あなたがそのような名前のオブジェクトを構築持っているように見えないようにwriteが構築されているので、あなたが問題を抱えていると思います。代わりにこれを試してください:

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] "在" 
+0

Hmは、上記の最小スニペットに影響を与えた元のアプリケーションで、名前付きオブジェクトを使用していました。さらに、上記のコードは、私の場合と同じ結果をもたらします。おそらく私はネイティブエンコーディングの問題がありますか? – Patrick

0

DBから来たUTF-8文字列でこのような問題があります。

ファイルを正しく保存するための唯一の方法は、ファイルをバイナリモードで保存することです。

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

問題は、(デフォルトのシステムのコーディングを使用して/またはいくつかのシステムのライトを使用して何らかのR-Windowsの特殊な動作です関数、実際の動作はわかりません)

テキストを書き込むにはWindows上でUTF8エンコーディングを使用するには、関数liのuseBytes=Tオプションを使用する必要がありますke writeLinesまたはreadLines:

+0

ありがとう!これは私のために働いた。そこには不完全なアドバイスがたくさんあります。 – Ruben