FileReader.readAsArrayBuffer处理非ASCII字符(含£)问题咨询
问题解决思路
首先纠正一个误解:你碰到的问题和「扩展ASCII」没关系,本质是编码不匹配。£的UTF-8编码是两个字节0xC2 0xA3,当你把这些字节直接当成单字节编码(比如ISO-8859-1或Windows-1252)解析时,0xC2会被转成字符Â,0xA3才是£,这就是为什么会出现两个字符。
怎么避免这个问题?
最稳妥的方式是用正确的编码解码文件内容,别直接处理Uint8Array的原始字节:
方法1:直接用readAsText()指定编码
如果确定文件是UTF-8编码,直接用FileReader.readAsText()并指定编码,就能自动处理多字节字符:
const reader = new FileReader(); reader.onload = function(e) { const content = e.target.result; // 这里的£就是单个正常字符,不用额外处理 }; reader.readAsText(file, 'UTF-8');
方法2:用TextDecoder解析ArrayBuffer
如果必须用readAsArrayBuffer(),可以用浏览器原生的TextDecoder类,指定正确编码解析:
const reader = new FileReader(); reader.onload = function(e) { const arrayBuffer = e.target.result; const decoder = new TextDecoder('UTF-8'); const content = decoder.decode(arrayBuffer); // 解析后的content里,£是单个字符 }; reader.readAsArrayBuffer(file);
能不能直接剔除Â?绝对不行!
这个Â并不是固定出现的,它只是UTF-8多字节字符的第一个字节被单字节编码解析后的产物:
- 比如€的UTF-8编码是
0xE2 0x82 0xAC,用单字节编码解析会变成三个乱码字符:â、‚、¬ - 其他非ASCII的UTF-8字符(比如中文、日文)都会生成不同的前缀乱码,不止Â一种
要是盲目剔除Â,会把其他正常的多字节字符也破坏掉,导致内容损坏。
内容的提问来源于stack exchange,提问作者hobbes_child
相关产品推荐
相关产品推荐

