如何在UTF-8编码文件中写入和读取可打印的ASCII字符?

it_*_*ure 7 file-io ascii r utf-8 file-encodings

我想写与包含字符UTF-8编码文件 10001100Œ拉丁资本结扎OE在扩展ASCII表,

zz <- file("c:/testbin", "wb")
writeBin("10001100",zz)
close(zz)
Run Code Online (Sandbox Code Playgroud)

当我用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)
Run Code Online (Sandbox Code Playgroud)

Alx*_*lxH 10

这里有很多困难.

因此,UTF-8要从CP1252-as-binary-as-string 写入,您必须将您的字符串转换为"原始"数字(字节的R类)然后转换为字符,将其"编码"更改CP1252UTF-8(实际上转换为它的字节值为相应字符的相应字符UTF-8),之后你可以将它重新转换为raw,最后写入文件:

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)
Run Code Online (Sandbox Code Playgroud)
  • 其次,当你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,并在每个操作系统上保持相同.希望能帮助到你.


PS:我不确定为什么在你的代码中x返回c5,我想c5 92如果你设置n=2(或更多)作为参数,它会返回readBin().在我的机器上(Mac OS X 10.7,R 3.0.2Win XP,R 2.15),它返回31了代码的十六进制ASCII表示'1'(第一个字符'10001100',有意义).也许你在Office中打开文件CP1252并将其保存在UTF-8那里,然后再回到R?