Node.js如何将编码为ISO-8859-1的接口响应转换为UTF-8格式
问题根因说明
你之前配置的两个参数无法解决问题的原因如下:
contentType用于声明你发送给外部服务的请求体的编码格式,不会影响对方返回内容的编码dataType仅用来告知请求库你期望接收的数据类型,不会覆盖请求库默认按照响应头charset=ISO-8859-1解码的逻辑
核心解决思路是:不使用请求库的自动解码能力,先获取响应的原始二进制Buffer,手动按照ISO-8859-1解码为字符串后再解析JSON即可。
具体方案
原生 http/https 模块实现
const http = require('http'); // Node.js v11+ 内置TextDecoder,低版本可以安装使用iconv-lite库 const { TextDecoder } = require('util'); http.get('你的外部服务请求地址', (res) => { const chunks = []; // 收集原始二进制数据 res.on('data', (chunk) => chunks.push(chunk)); res.on('end', () => { const buffer = Buffer.concat(chunks); // 手动按ISO-8859-1解码 const decoder = new TextDecoder('ISO-8859-1'); const rawJsonStr = decoder.decode(buffer); // 解析为JSON对象 const result = JSON.parse(rawJsonStr); // 后续业务逻辑 console.log(result); }) })
Axios 实现
const axios = require('axios'); const { TextDecoder } = require('util'); axios.get('你的外部服务请求地址', { // 关键配置:要求返回原始二进制数据,不自动解码 responseType: 'arraybuffer' }).then(res => { const decoder = new TextDecoder('ISO-8859-1'); const rawJsonStr = decoder.decode(res.data); const result = JSON.parse(rawJsonStr); console.log(result); })
node-fetch 实现
const fetch = require('node-fetch'); const { TextDecoder } = require('util'); fetch('你的外部服务请求地址').then(async res => { // 获取原始二进制数据 const buffer = await res.arrayBuffer(); const decoder = new TextDecoder('ISO-8859-1'); const rawJsonStr = decoder.decode(buffer); const result = JSON.parse(rawJsonStr); console.log(result); })
替代方案
如果可以协调外部服务提供方,要求对方调整返回响应的Content-Type为application/json;charset=UTF-8,直接返回UTF-8编码的内容,是成本最低的长期解决方案。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

