7

拡張 ASCII テーブルのラテン大文字合字 OE である文字10001100を含む UTF-8 エンコーディングのファイルに書き込みたいのですが 、Œ

zz <- file("c:/testbin", "wb")
writeBin("10001100",zz)
close(zz)

office(encoding=utf-8)でファイルを開くとŒ読めないのはreadBin?

zz <- file("c:/testbin", "rb")
readBin(zz,raw())->x
x
[1] c5
readBin(zz,character())->x
Warning message:
In readBin(zz, character()) :
incomplete string at end of file has been discarded
x
character(0)
4

2 に答える 2

10

ここには複数の困難があります。

  • まず、実際にはいくつかの「拡張 ASCII」テーブルがあります。Windows を使用しているため、おそらくそれらの 1 つであるCP1252Windows-1252を使用しており、 orとも呼ばれANSI、Win のデフォルトの「ラテン」エンコーディングです。ただし、このテーブル ファミリー内でのコードはŒ異なります。ではCP1252、あなたが書いたようにまたはで"Œ"表されます。ただし、 には存在しません。そして、rlegendi が示すように、またはに対応します。10001100"\x8c"ISO-8859-1UTF-8"\xc5\x92""\u0152"

したがって、-as-binary-as-string から書き込むにUTF-8CP1252、文字列を「生の」数値 (バイトの R クラス) に変換してから文字に変換し、その「エンコーディング」を からCP1252に変更する必要がありますUTF-8(実際には変換します)。そのバイト値を の同じ文字の対応する値にUTF-8変換した後、生に再変換し、最後にファイルに書き込むことができます。

char_bin_str <- '10001100'
char_u <- iconv(rawToChar(as.raw(strtoi(char_bin_str, base=2))),
              # "\x8c"    8c     140    '10001100'
                from="CP1252",
                to="UTF-8")

test.file <- "~/test-unicode-bytes.txt"

zz <- file(test.file, 'wb')
writeBin(charToRaw(char_u), zz)
close(zz)
  • 第二に、あなたがするときreadBin()、十分な大きさの読み取りバイト数を与えることを忘れないでください(n=file.info(test.file)$sizeここで)、それ以外の場合は最初のバイトのみを読み取ります(以下を参照):

    zz <- file(test.file, 'rb') x <- readBin(zz, 'raw', n=file.info(test.file)$size) close(zz)

    x [1] c5 92

  • 第三に、最終的にそれを文字に戻し、R によって正しく理解されて表示されるようにしたい場合は、最初に を使用して文字列に変換する必要がありますrawToChar()。表示される方法は、デフォルトのエンコーディングによって異なります。それが何であるかを確認Sys.getlocale()1252してください (おそらく、Windows では末尾が何か)。おそらく最良の方法は、文字が次のように読み取られるように指定することUTF-8です。そうしないと、デフォルトのエンコーディングで理解されます。

    xx <- rawToChar(x) エンコーディング(xx) <- "UTF-8"

    xx [1]「あ」

これにより、物事が制御され、正しいバイトが に書き込まれUTF-8、すべての OS で同じになるはずです。それが役に立てば幸い。


PSx : コードでが返された理由が正確にはわかりません。パラメータとして (またはそれ以上) を に設定した場合c5は返されたと思います。私のマシン ( Mac OS X 10.7、R 3.0.2およびWin XP、R 2.15 ) では、(意味のあるの最初の文字)の 16 進 ASCII 表現である がコードと共に返されます。R に戻る前に、Office でファイルを開いてそのまま保存したのではないでしょうか?c5 92n=2readBin()31'1''10001100'CP1252UTF-8

于 2013-12-16T20:27:27.737 に答える
1

代わりにこれを試してください (バイナリ値を UTF エンコーディングに置き換えたのは、そのような出力が必要な場合に適していると思うからです):

writeBin(charToRaw("\u0152"), zz)
于 2013-12-11T10:41:07.967 に答える