我在阅读使用“特殊”字符的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_encode
,utf8_decode
,iconv
之类的库和方法,以及相同的结果,即带有?
符号的特殊字符。
我在想的是,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:相同的请求,但使用latin1
从iso-8859-1
和iconv-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.
答案 0 :(得分:1)
该提要使用ISO-8859-1进行编码,因此您需要对其进行解码。
在请求上放置Content-Type标头字段将无效。它会描述 request 正文的类型(对于GET来说是空的)。