Node.JS, как декодировать ISO-8859-1 в UTF-8? - PullRequest
0 голосов
/ 31 октября 2018

Я запрашиваю базу данных в ISO-8859-1, но, поскольку узел работает в режиме UTF8, я должен преобразовать данные, возвращаемые этой конкретной СУБД.

Я пробовал iconv, но не могу понять, как получить желаемый результат. Например, я получил 0xc2 0x80, когда ожидал, что 0xe2 0x82 0xac будет возвращено.

var iconv = require('iconv-lite');

var buffer = Buffer.from([0x80]);
var str = iconv.decode(buffer, 'iso-8859-1');
console.log({str});
console.log(new Buffer(str, 'utf8'));
iconv.encode(new Buffer('€','utf8'),'iso-8859-1');

/*
Which outputs
{ str: '' }
<Buffer c2 80>*/
  • В UTF8 € представлено 0xe2 0x82 0xac
  • В ISO-8859-1 обозначается как 0x80

Обновление:

  • Ожидаемое значение € 0xe2 0x82 0xac, а не 0xdb, как я упоминал изначально по ошибке
  • Как указано в комментариях, ISO-8859-1 не содержит символа €.

1 Ответ

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

Благодаря комментариям выше я понимаю, что, несмотря на то, что в моей базе данных есть набор символов "ISO8859_1", IBEXPERT использует и представляет мне данные в кодировке WINDOWS-1252 (известной как ANSI), которая объясняет, почему Я видел 0x80 в их программе просмотра HEX.

Может быть, WINDOWS-1252 расширяет набор символов ISO8859_1 ??

Например: Запуск кода ниже работает нормально: € правильно декодируется.

var str = iconv.decode(buffer, 'WINDOWS-1252');
console.log({str});
console.log(new Buffer(str, 'utf8'));
var str2 = iconv.encode(new Buffer('€','utf8'),'WINDOWS-1252');
console.log({strEncoded: str2})
/*
{ str: '€' }
<Buffer e2 82 ac>
{ strEncoded: <Buffer 80> }
* */

Странная часть заключается в том, что мой запрос к базе данных, который использует node-firebirdlib-fbclient для связи с моей базой данных firebird, разрешается с помощью символа UTF8, который не может быть представлен в UTF8, как вы можете видеть по значению символа, которое is '', что переводит в 0xc2 0x80.

   { idNumber: 1,
     id: 'EUR',
     taxPercentage: 1,
     isDefault: -1,
     accountNumber: null,
     dontUse: false,
     symbol: '' },
  eur: <Buffer c2 80> }

eur: выводится console.log(new Buffer(result.symbol,'utf8'))

И расшифровываем это из utf8 в 'WINDOWS-1252' следующей командой iconv.decode(Buffer.from(currency.symbol, 'utf8'), 'WINDOWS-1252') возвращает

... "defaultCurrency": { "id": "EUR", «символ»: «В», "label": "EUR" } ...

...