我想写与包含字符UTF-8编码文件
10001100
是Œ
拉丁资本结扎OE在扩展ASCII表,
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)
AlxH.. 10
这里有很多困难.
首先,实际上有几个"扩展ASCII"表.由于你在Windows上,你可能正在使用CP1252,它也是其中之一,也称为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)
其次,当你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?