Проблемы с кодированием RSS с использованием Node.js - PullRequest
0 голосов
/ 02 октября 2018

У меня проблемы с чтением 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.

1 Ответ

0 голосов
/ 02 октября 2018

Фид закодирован в ISO-8859-1, так что это кодировка, необходимая для его декодирования.

Размещение поля заголовка Content-Type в запросе не будет иметь эффекта;он будет описывать тип тела запроса (которое пусто для GET).

...