7

我想写入一个 UTF-8 编码的文件,其中包含 扩展 ASCII 表中拉丁大写连字 OE 的字符10001100Œ

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)
4

2 回答 2

10

这里有很多困难。

因此,UTF-8要从CP1252-as-binary-as-string 写入,您必须将字符串转换为“原始”数字(字节的 R 类),然后转换为字符,将其“编码”从更改CP1252UTF-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.2Win XP、R 2.15)上,它使用您的代码返回(中的第一个字符,这是有道理的)31的十六进制 ASCII 表示。也许您在返回 R 之前在 Office 中打开文件并将其保存在那里?'1''10001100'CP1252UTF-8

于 2013-12-16T20:27:27.737 回答
1

试试这个(我用 UTF 编码替换了二进制值,因为我认为当你想要这样的输出时它会更好):

writeBin(charToRaw("\u0152"), zz)
于 2013-12-11T10:41:07.967 回答