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
这里有很多困难.
Windows-1252或ANSI,以及Win默认的"拉丁"编码.但是,此代码Œ表中的代码会有所不同.In CP1252,"Œ"由你所写的10001100或代表"\x8c".但它并不存在ISO-8859-1.正如rlegendi指出的那样,UTF-8它对应于"\xc5\x92"或"\u0152".因此,UTF-8要从CP1252-as-binary-as-string 写入,您必须将您的字符串转换为"原始"数字(字节的R类)然后转换为字符,将其"编码"更改CP1252为UTF-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.2和Win XP,R 2.15),它返回31了代码的十六进制ASCII表示'1'(第一个字符'10001100',有意义).也许你在Office中打开文件CP1252并将其保存在UTF-8那里,然后再回到R?