Angular4中Blob下载文件指定ANSI编码却存为UTF-8的解决方法
解决Angular4下载Window-1252编码文件时自动转为UTF-8的问题
这个坑我之前踩过!核心问题出在你用的response._body——它已经被浏览器自动转成UTF-8编码的字符串了,这时候再用它创建Blob并指定charset=ansi完全没用,因为原始的Window-1252编码信息早就丢失了。
下面是具体的解决步骤:
1. 让Angular请求返回原始二进制数据
在发起Http请求时,必须配置responseType: 'arraybuffer',这样Angular才不会自动把响应解析成字符串,而是保留原始的字节数据:
import { Http } from '@angular/http'; // Angular4的Http模块 import { saveAs } from 'file-saver'; // 示例请求 this.http.get('/your-java-api-url', { responseType: 'arraybuffer' }) .subscribe((response: ArrayBuffer) => { // 这里处理二进制响应 this.downloadFile(response); });
2. 用原始二进制数据创建Blob并保存
拿到ArrayBuffer类型的响应后,直接用它创建Blob,并且明确指定编码为windows-1252(注意ansi是系统依赖的别名,Java返回的是标准的Window-1252,直接写这个更准确):
downloadFile(response: ArrayBuffer) { const filename = 'test.txt'; // 用原始ArrayBuffer创建Blob,指定正确的编码类型 const blob = new Blob([response], { type: 'text/plain;charset=windows-1252' }); saveAs(blob, filename); }
为什么之前的方法失效?
当你不指定responseType时,Angular默认会把响应解析为UTF-8编码的字符串。浏览器在解码Window-1252字节为UTF-8字符串的过程中,会对无法识别的字节进行转义或替换,导致原始编码信息丢失。这时候再把字符串存入Blob,即使指定charset=ansi,文件本质还是UTF-8编码的,自然达不到预期效果。
额外提一句:如果你的Java后端已经在响应头里设置了Content-Type: text/plain;charset=windows-1252,那也可以从响应头里读取这个类型来创建Blob,这样更灵活,但手动指定也是完全没问题的。
内容的提问来源于stack exchange,提问作者user1015388
相关产品推荐
相关产品推荐

