我想写一个包含该字符的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}}
答案 0 :(得分:10)
这里有很多困难。
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)