使用Node.js的RSS编码问题

时间:2018-10-02 07:08:58

标签: node.js http encoding character-encoding rss

我在阅读使用“特殊”字符的RSS提要时遇到了麻烦,例如this提要是西班牙语,并且包含á,é,í,ó,ú,ü,ç,ñ等字符。当我在浏览器(例如Chrome)中打开它时,可以正确显示字符。

现在,我正在尝试使用Node.js上的request库阅读此供稿。这是我的代码:

const rq = require('request');

module.exports.request = (url, method, json, body, headers) => new Promise((resolve, reject) =>
  rq({
    url,
    method,
    json,
    body,
    headers
  }, (error, response, body) => {
    if (error) {
      reject(error);
    } else {
      resolve(body);
    }
  })
);

let feed = rq(URL_HERE, 'GET', false, undefined, HEADERS_HERE)

在这段代码中,我尝试使用诸如Content-Type: application/rss+xml; charset=utf-8之类的HTTP标头来强制页面以UTF-8呈现(此编码支持该字符),但是在接收到请求时特殊字符显示为?符号。

在控制台中打印也不是问题,因为该供稿数据直接保存到Firebase Firestore数据库中,并且我在数据库中也有?

我尝试了utf8_encodeutf8_decodeiconv之类的库和方法,以及相同的结果,即带有?符号的特殊字符。

我在想的是,RSS XML enconding标头显示ISO-8859-1,并且我试图强制使用UTF-8解析Web,但无法正常工作,但是显示为什么在浏览器中正确显示

谢谢!

编辑

一些结果可以澄清评论,预期结果应该是:

Las banderas del Ayuntamiento ondearán mañana a media asta.

1:无需解码的简单请求

代码:

const request = require('request');

const myRequest = (url, method, json, body, headers) => new Promise((resolve, reject) =>
  request({
    url,
    method,
    json,
    body,
    headers
  }, (error, response, body) => {
    if (error) {
      reject(error);
    } else {
      resolve(body);
    }
  })
);

myRequest('http://www.barakaldo.org/portal/html/rss/noticias/search.jsp?languageId=es_ES', 'GET')
  .then((feed) => console.log(feed))
  .catch((error) => console.error(error));

结果:

Las banderas del Ayuntamiento ondear�n ma�ana a media asta.

2:相同的请求,但使用latin1iso-8859-1iconv-lite进行解码

代码:

const request = require('request');
const iconv = require('iconv-lite');

const myRequest = (url, method, json, body, headers) => new Promise((resolve, reject) =>
  request({
    url,
    method,
    json,
    body,
    headers
  }, (error, response, body) => {
    if (error) {
      reject(error);
    } else {
      resolve(body);
    }
  })
);

myRequest('http://www.barakaldo.org/portal/html/rss/noticias/search.jsp?languageId=es_ES', 'GET')
  .then((feed) => {
    let decodedFeed = iconv.decode(Buffer.from(feed), 'latin1');
    console.log(decodedFeed);
  })
  .catch((error) => console.error(error));

结果:

Las banderas del Ayuntamiento ondear�n ma�ana a media asta.

1 个答案:

答案 0 :(得分:1)

该提要使用ISO-8859-1进行编码,因此您需要对其进行解码。

在请求上放置Content-Type标头字段将无效。它会描述 request 正文的类型(对于GET来说是空的)。