Javascript-форум (https://javascript.ru/forum/)
-   Node.JS (https://javascript.ru/forum/node-js-io-js/)
-   -   Проблемы с кодировкой на node.js (https://javascript.ru/forum/node-js-io-js/64328-problemy-s-kodirovkojj-na-node-js.html)

6at9l 03.08.2016 13:51

Проблемы с кодировкой на node.js
 
Добрый день.
Делаю парсер сайтов на node js и вот уже второй день не получается разобраться с кодировкой (страница имеет кодировку windows-1251), пробовал несколько модуле для изменения кодировки (iconv-lite/encoding) не помогает, на выходе получаю непонятные символы.
Может кто еще сталкивался с подобной проблемой ?

Erolast 03.08.2016 14:09

Цитата:

пробовал несколько модуле для изменения кодировки (iconv-lite/encoding) не помогает, на выходе получаю непонятные символы
А как пробуешь-то? iconv-lite нормально должен переводить.

6at9l 03.08.2016 15:08

body = iconv.encode(body, "win1251");

Erolast 03.08.2016 16:24

encode переводится как закодировать. Эта функция берет javascript-строку и конвертирует ее в указаную кодировку, возвращая объект Buffer - массив фиксированого размера с набором байтов.

В твоем случае надо использовать decode, причем, на вход надо подавать не строку, а именно что буфер. На низком уровне это выглядит так:
// Код рабочий, можно запустить и проверить - должен вывести коректный русский текст
const iconv = require("iconv-lite");
const http = require("http");

http.get("http://forum.heroes35.net/", (res) => {
  let chunks = [];

  res.on("data", (chunk) => {
    chunks.push(chunk);
  });

  res.on("end", (chunk) => {
    let body = iconv.decode(Buffer.concat(chunks), "win1251");
    console.log(body);
  });
});


Но лучше, конечно, использовать потоковый интерфейс:
const iconv = require("iconv-lite");
const http = require("http");

http.get("http://forum.heroes35.net/", (res) => {
  res.pipe(iconv.decodeStream("win1251")).collect((err, body) => {
    if (err) throw err;
    console.log(body);
  })
});

6at9l 04.08.2016 10:15

Большое спасибо за помощь, все работает.

AlexAlesh 19.05.2020 12:16

Добрый день! Попытался использовать пример выше, но не получилось для моей задачи. А задача в следующем - есть JSON файл внутри русские буквы в перемешку с английскими. Файл c кодировкой cp1251(windows-1251). Этот файл нужно перевести в UTF-8. Попробовал использовать "iconv-lite", но все приводило к крякозябрам такого вида "пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ їЅ пїЅ-7-2" или просто "����"
Вот кусок JSON:
"TEST": {
    "CODE": 1,
    "NAME": "����",
  },


Читаю файл через FS


Часовой пояс GMT +3, время: 14:03.