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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 05:36:10