【问题标题】:How to write and read printable ASCII characters to/from UTF-8 encoding file?如何在 UTF-8 编码文件中写入和读取可打印的 ASCII 字符?
【发布时间】:2013-12-29 03:25:52
【问题描述】:

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

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)

【问题讨论】:

  • 我从charToRaw 得到8c,你能把sessionInfo() 的输出放到你的问题中吗?

标签: r file-io utf-8 ascii file-encodings


【解决方案1】:

这里有很多困难。

因此,要从 CP1252-as-binary-as-string 写入 UTF-8,您必须将字符串转换为“原始”数字(字节的 R 类),然后是字符,更改其"encoding" 从CP1252UTF-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

    x [1] c5 92

  • 第三,如果最后你想把它转回一个字符,R可以正确理解和显示,你必须先用rawToChar()把它转换成一个字符串。现在,它的显示方式取决于您的默认编码,请参阅 Sys.getlocale() 以了解它是什么(在 Windows 上可能以 1252 结尾)。最好的办法可能是指定你的字符应该读作UTF-8——否则它会被你的默认编码理解。

    xx

    xx [1] “Œ”

这应该可以控制一切,在UTF-8 中写入正确的字节,并且在每个操作系统上都相同。希望对您有所帮助。


PS:我不确定为什么在您的代码中x 返回c5,我猜如果您设置了n=2(或更多),它会返回c5 92作为readBin() 的参数。在我的机器上(Mac OS X 10.7, R 3.0.2Win XP, R 2.15)它返回31'1' 的十六进制 ASCII 表示( '10001100' 中的第一个字符,这是有道理的),以及您的代码。也许您在 Office 中以CP1252 的身份打开文件,然后在此处将其保存为UTF-8,然后再返回 R?

【讨论】:

    【解决方案2】:

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

    writeBin(charToRaw("\u0152"), zz)
    

    【讨论】:

    猜你喜欢
    • 2011-07-07
    • 2013-03-06
    • 2011-12-23
    • 2018-06-13
    • 1970-01-01
    • 2014-04-06
    • 2016-08-18
    • 2012-06-10
    • 1970-01-01
    相关资源
    最近更新 更多