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

时间:2013-12-11 08:40:24

标签: r file-io utf-8 ascii file-encodings

我想写一个包含该字符的UTF-8编码的文件  10001100 Œ扩展ASCII表中的zz <- file("c:/testbin", "wb") writeBin("10001100",zz) close(zz) 拉丁语首都连字OE,

Œ

当我用office打开文件(encoding = utf-8)时,我可以看到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) 我读不懂的是readBin吗?

{{1}}

2 个答案:

答案 0 :(得分:10)

这里有很多困难。

  • 首先,实际上有several "Extended ASCII" tables由于您使用的是Windows,因此您可能正在使用其中之一的CP1252,也称为Windows-1252或{ {3}},以及Win默认的“拉丁”编码。但是在这个表格系列中ANSI。正如您所写的,在CP1252中,"Œ"10001100"\x8c"表示。但它the code for Œ varies。在UTF-8中,它与"\xc5\x92""\u0152"相对应,正如rlegendi指出的那样。

所以,要从UTF-8 - as-binary-as-string写CP1252,你必须将你的字符串转换成一个“原始”数字(字节的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&lt; - file(test.file,'rb') x&lt; - readBin(zz,'raw',n = file.info(test.file)$ size) 关闭(ZZ)

      

    X   [1] c5 92

  • 第三,如果最后你要将它变回R中正确理解和显示的角色,你首先要将它转换为rawToChar()的字符串。现在,它的显示方式取决于您的默认编码,请参阅Sys.getlocale() 以查看它是什么(可能在Windows上以1252结尾)。最好的可能是指定您的角色应该被理解为UTF-8 - 否则将使用您的默认编码来理解它。

    xx&lt; - rawToChar(x) 编码(xx)&lt; - “UTF-8”

      

    XX   [1]“Œ”

这应该控制事情,在UTF-8中写入正确的字节,并在每个操作系统上都相同。希望它有所帮助。


PS :我不完全确定您的代码x返回c5的原因,如果您设置{我认为它会返回c5 92 {1}}(或更多)作为n=2的参数。在我的机器上( Mac OS X 10.7,R 3.0.2 Win XP,R 2.15 ),它返回readBin(),{{1}的十六进制ASCII表示形式使用您的代码(31中的第一个字符,这是有意义的)。也许您在Office中以'1'打开文件并将其保存为'10001100',然后返回R?

答案 1 :(得分:1)

试试这个(我用UTF编码替换了二进制值,因为我认为当你需要这样的输出时它会更好):

writeBin(charToRaw("\u0152"), zz)