这里有很多困难。
因此,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'CP1252UTF-8