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

如何用Node.js下载ISO 8859-9编码XML文件?解决乱码问题

解决ISO 8859-9编码XML的字符乱码问题

这个问题我之前也碰到过,核心原因就是编码不匹配:你在代码里用res.setEncoding('utf8')强制把响应流按UTF-8解码,但目标XML是ISO 8859-9(土耳其语常用的Latin-5编码),自然会出现字符显示错误。下面是具体的解决步骤和修改后的代码:

步骤1:安装编码转换库

Node.js的内置Buffer对ISO 8859-9的支持有限,我们需要用iconv-lite这个库来处理编码转换。先安装它:

npm install iconv-lite --save

步骤2:修改getXml函数逻辑

关键是不要设置响应编码,让数据以原始Buffer的形式收集,之后再转成正确的ISO 8859-9编码字符串:

修改后的完整代码:

var express = require('express');
var http = require('http');
var xpath = require('xpath');
var dom = require('xmldom').DOMParser;
var iconv = require('iconv-lite'); // 引入编码转换库
var router = express.Router();

getXml = function(resUrl, callback) {
  http.get(resUrl, (res) => {
    // 取消setEncoding,让数据以Buffer形式接收
    let chunks = [];
    
    // 收集所有二进制片段
    res.on('data', (chunk) => {
      chunks.push(chunk);
    });
    
    // 数据接收完成后统一处理
    res.on('end', () => {
      // 合并Buffer并转成ISO 8859-9编码的字符串
      let xmlString = iconv.decode(Buffer.concat(chunks), 'iso-8859-9');
      
      try {
        // 解析正确编码的XML字符串
        var doc = new dom().parseFromString(xmlString);
        callback(null, doc);
      } catch (err) {
        callback(err, null);
      }
    });
    
    // 捕获请求错误
    res.on('error', (err) => {
      callback(err, null);
    });
  });
};

为什么这么改?

  • 去掉res.setEncoding('utf8')后,data事件返回的是原始二进制Buffer,避免了错误解码导致的乱码
  • 用Buffer.concat(chunks)把所有二进制片段合并成完整的Buffer,保证数据完整性
  • 通过iconv.decode将Buffer按ISO 8859-9编码转换成正确的字符串,再交给DOMParser解析就不会有字符显示问题了

如果你的XML编码可能动态变化(比如有时是UTF-8,有时是ISO 8859-9),还可以读取响应头的content-type字段(例如text/xml; charset=iso-8859-9),动态获取编码类型后再转换,让代码更健壮。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:30:18