如何在UTF-8编码文件中写入和读取可打印的ASCII字符?

 mobiledu2502939473 发布于 2023-02-11 15:53

我想写与包含字符UTF-8编码文件 10001100Œ拉丁资本结扎OE在扩展ASCII表,

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)

AlxH.. 10

这里有很多困难.

首先,实际上有几个"扩展ASCII"表.由于你在Windows上,你可能正在使用CP1252,它也是其中之一,也称为Windows-1252ANSI,以及Win默认的"拉丁"编码.但是,此代码Œ表中的代码会有所不同.In CP1252,"Œ"由你所写的10001100或代表"\x8c".但它并不存在ISO-8859-1.正如rlegendi指出的那样,UTF-8它对应于"\xc5\x92""\u0152".

因此,UTF-8要从CP1252-as-binary-as-string 写入,您必须将您的字符串转换为"原始"数字(字节的R类)然后转换为字符,将其"编码"更改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 < - 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表示'1'(第一个字符'10001100',有意义).也许你在Office中打开文件CP1252并将其保存在UTF-8那里,然后再回到R?

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有