Как преобразовать кодировку символов из CP932 в UTF-8 в javascript для nodejs, используя модуль nodejs-iconv (или другое решение) - PullRequest
6 голосов
/ 20 июня 2011

Я пытаюсь преобразовать строку из CP932 (он же Windows-31J) в utf8 в javascript. По сути, я сканирую сайт, который игнорирует запрос utf-8 в заголовке запроса и возвращает кодированный текст cp932 (хотя метатег html указывает, что страница является shift_jis).

В любом случае, у меня вся страница хранится в строковой переменной с именем "html". Оттуда я пытаюсь преобразовать его в utf8, используя этот код:

var Iconv = require('iconv').Iconv;
var conv = new Iconv('CP932', 'UTF-8//TRANSLIT//IGNORE');

var myBuffer = new Buffer(html.length * 3);
myBuffer.write(html, 0, 'utf8')
var utf8html = (conv.convert(myBuffer)).toString('utf8');

Результат не тот, который должен быть. Например, строка: "投稿 者 さ ん の 稚 内 全日空 ホ テ ル の ク チ コ ミ (感想 · 情報)" выходит как «ソ ス ソ ス ソ ス электронной ソ ス メ ゑ ソ ス ソ ス ソ ス ソ ス ソ ス ソ ス т ソ ス ソ ス ソ ス S ソ ス ソ ス ソ ス ソ ス ソ ス г ソ ス е ソ ス ソ ス ソ ス フ ク ソ ス` 100 ス R ソ ス ~ (ソ ス ソ ス ソ ス ソ ス ソ ソ ソ ス ソ ス ソ ス ")"

Если я удаляю // TRANSLIT // IGNORE (что должно привести к тому, что он будет возвращать похожие символы для пропущенных символов, а при отсутствии пропуска символов, не поддерживающих перекодировку), я получаю эту ошибку: Ошибка: EILSEQ, недопустимая последовательность символов.

Я открыт для использования любого решения, которое может быть реализовано в nodejs, но мои результаты поиска не дали много опций за пределами модуля nodejs-iconv.

nodejs-iconv ref: https://github.com/bnoordhuis/node-iconv

Спасибо!

Изменить 24.06.2011: Я пошел дальше и реализовал решение на Java. Однако я все еще был бы заинтересован в javascript-решении этой проблемы, если кто-то может решить ее.

Ответы [ 3 ]

5 голосов
/ 10 января 2013

У меня была такая же проблема, но с CP1250. Я искал проблему везде, и все было в порядке, кроме вызова запроса - мне пришлось добавить encoding: 'binary'.

request = require('request')
Iconv  = require('iconv').Iconv

request({uri: url, encoding: 'binary'}, function(err, response, body) {
    body = new Buffer(body, 'binary')
    iconv = new Iconv('CP1250', 'UTF8')
    body = iconv.convert(body).toString()
    // ...
})
5 голосов
/ 28 августа 2011

У меня сегодня такая же проблема :)
Это зависит от libiconv. Вам нужен libiconv-1.13-ja-1.patch.
Пожалуйста, проверьте следующее.

или вы можете избежать проблем, используя iconv-jp try

npm install iconv-jp
0 голосов
/ 02 сентября 2011

https://github.com/bnoordhuis/node-iconv/issues/19

Я пробовал /Users/Me/node_modules/iconv/test.js узел test.js.Возвращает ошибку.

В Mac OS X Lion эта проблема, похоже, зависит от gcc.

...