You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JS下载服务器返回的Windows-1251编码文件乱码该如何修复?

乱码发生的原因
  • 乱码出现在前端HTTP请求解析响应的环节:你当前的代码将响应类型声明为string,JS的HTTP客户端默认会用UTF-8编码把服务端返回的二进制字节流解码为字符串,但你服务端返回的是Windows-1251编码的字节,解码规则不匹配直接导致字符乱码,后续生成Blob时使用的已经是错误的字符数据,最终下载的文件自然显示乱码。
  • Postman下载正常是因为Postman会直接接收原始字节流写入文件,没有强制用UTF-8解码响应内容。
修复方案

方案1:前端修改请求逻辑(改动最小,优先推荐)

将HTTP请求的响应类型设置为blob或arraybuffer,直接获取原始字节流,不需要做字符串转码,示例代码如下:

async downloadValidationReport(): Promise<void> {
   // 指定响应类型为blob,避免自动按UTF-8解码
   const result = await http.post<Blob>(await getExportValidationResultUrl(), this.preparePayload(), {
     headers: { 'Content-Type': 'application/json' },
     responseType: 'blob' // 若使用axios等客户端,配置项名称保持一致即可
   });
   // 直接用拿到的blob保存文件即可
   saveAs(result, 'validation.csv');
}

如果需要明确指定文件编码提升兼容性,生成Blob时可补充编码声明:

const file = new Blob([result], { type: 'text/csv;charset=windows-1251' });
saveAs(file, 'validation.csv');

方案2:后端调整(可选,适配性更强)

如果要避免前端编码适配问题,可在后端将返回的文件内容转成UTF-8编码,同时在返回的Content-Type响应头中明确声明charset=utf-8,这样前端默认按UTF-8解析也不会出现乱码。

特殊场景处理

如果受业务限制不能修改响应类型,可通过TextDecoderAPI对原始字节流做指定编码的解码:

// 先获取arraybuffer格式的原始响应
const buffer = await http.post<ArrayBuffer>(await getExportValidationResultUrl(), this.preparePayload(), {
  headers: { 'Content-Type': 'application/json' },
  responseType: 'arraybuffer'
});
// 用Windows-1251编码解码字节流
const decoder = new TextDecoder('windows-1251');
const content = decoder.decode(buffer);
// 后续可按需求处理内容,或转成UTF-8格式的文件保存

内容的提问来源于stack exchange,提问作者framzik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 14:39:02