这里有很多困难。
因此,UTF-8
要从CP1252
-as-binary-as-string 写入,您必须将字符串转换为“原始”数字(字节的 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 <- 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 表示。也许您在返回 R 之前在 Office 中打开文件并将其保存在那里?'1'
'10001100'
CP1252
UTF-8