У меня проблемы с чтением RSS-каналов, в которых используются «специальные» символы, например, этот канал является испанским и содержит такие символы, как á, é, í, ó, ú, ü, ç, ñ... когда я открываю его в браузере (в моем случае Chrome), символы отображаются правильно.
Теперь я пытаюсь прочитать этот канал, используя библиотеку request
на Node.js.Это мой код:
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)
В этом коде я пытался использовать HTTP-заголовки, такие как Content-Type: application/rss+xml; charset=utf-8
, чтобы заставить страницу отображаться в UTF-8 (эта кодировка поддерживает эти символы), но ничего, когдазапрос получен, специальные символы отображаются с символом ?
.
Печать в консоли также не является проблемой, потому что эти данные канала напрямую сохраняются в базе данных Firebase Firestore, и у меня есть ?
в базе данных тоже.
Я пробовал библиотеки и методы, такие как utf8_encode
, utf8_decode
, iconv
и тот же результат, специальные символы с символом ?
.
Я думаю, что заголовок, содержащий RSS XML, показывает ISO-8859-1
, и я пытаюсь выполнить синтаксический анализ сети с использованием UTF-8 и работает неправильно, но почему в браузере отображается правильно ?
Спасибо!
РЕДАКТИРОВАТЬ
Некоторые результаты для уточнения комментариев, ожидаемый результат должен быть:
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.