使用FileReader的readAsBinaryString和readAsText的区别

11
举个例子,当我使用FileReader API从文件中读取π字符(\u03C0)时,如果我使用FileReader.readAsText(blob),我会得到π字符,这是可以预料的。但是,当我使用FileReader.readAsBinaryString(blob)时,我得到的结果是\xcf\x80,它似乎与π字符没有任何可见的相关性。发生了什么?(这可能与UTF-8/16编码方式有关...)

2
CF80 是 π 的 UTF-8 编码。 - deceze
...那可能太明显了,但如果你愿意,可以将其发布为答案。 - gengkev
2个回答

22

FileReader.readAsText考虑了文件的编码。特别是,由于文件是UTF-8编码,一个字符可能包含多个字节。读取为文本时,UTF-8被按原样读取,您得到的就是字符串。

FileReader.readAsBinaryString则完全按照字面意思操作。它逐字节读取文件。它不识别多字节字符,这对于二进制文件(基本上除了文本文件以外的任何文件)尤其有好处。由于“π”是一个双字节字符,所以您在字符串中得到组成它的两个单独字节。

这种差异在许多地方都可以看到。特别是当编码丢失时,您会看到像“é”这样的字符显示为“é”。


谢谢...所以当我尝试将\xA2附加到BlobBuilder时,它变成了\xC2\xA2,因为这是UTF-8编码,但是我该如何获取\xA2?(它是单字节字符) - gengkev
哦,我猜我得使用一个ArrayBuffer。 - gengkev

2

好的,如果这是你需要的全部...... :)

CF80 是 π 的 UTF-8 编码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接