JS无法保存ANSI/ISO-8859-1编码文件,出现Â字符如何解决?
如何生成正确编码为ISO-8859-1的文件并避免Â字符?
问题背景
需要从浏览器下载包含ASCII(161)、ASCII(162)、ASCII(163)、ASCII(164)和换行符的文件,要求保存为windows-1252编码,使用以下代码实现:
let data = "¡¢£¤\n" var a = document.createElement('a') var blob = new Blob([data], { 'type':'text/plain;charset=windows-1252' }) a.href = window.URL.createObjectURL(blob) a.download = 'stefano.dat' a.click()
但保存的stefano.dat实际为UTF-8编码,切换编码为ISO-8859-1时,每个字符前都会出现Â字符。需要解决如何生成正确编码为ISO-8859-1且无Â字符的文件,并明确问题根源。
问题根源
JavaScript字符串默认采用UTF-16编码,当直接将字符串传入Blob时,浏览器会自动将其转换为UTF-8字节流。Blob构造函数中的charset=windows-1252仅设置了Content-Type头信息,不会改变实际存储的字节编码。
出现Â字符的原因是:UTF-8中,¡(U+00A1)这类字符会被编码为两个字节0xC2 0xA1,用ISO-8859-1编码解析时,0xC2会被识别为Â,0xA1识别为¡,因此每个目标字符前都会多出Â。
解决方法
要生成真正的ISO-8859-1(与windows-1252在161-164字符范围内兼容)编码文件,需手动将字符转换为对应编码的字节数组,再传入Blob:
方法一:直接构造目标字节数组
// 0xA1-0xA4对应目标ASCII值,0x0A为换行符 const bytes = new Uint8Array([0xA1, 0xA2, 0xA3, 0xA4, 0x0A]); const a = document.createElement('a'); const blob = new Blob([bytes], { type: 'text/plain;charset=iso-8859-1' }); a.href = window.URL.createObjectURL(blob); a.download = 'stefano.dat'; a.click();
方法二:从字符串映射为ISO-8859-1字节
适用于字符均在ISO-8859-1编码范围内的场景:
const str = "¡¢£¤\n"; // 将每个字符转换为对应的ISO-8859-1字节值 const bytes = new Uint8Array(str.split('').map(char => char.charCodeAt(0))); const a = document.createElement('a'); const blob = new Blob([bytes], { type: 'text/plain;charset=iso-8859-1' }); a.href = window.URL.createObjectURL(blob); a.download = 'stefano.dat'; a.click();
通过上述方法生成的文件为纯ISO-8859-1编码,打开时不会出现Â字符。
内容的提问来源于stack exchange,提问作者Stefano Radaelli
相关产品推荐
相关产品推荐

