Node.JS如何将ISO-8859-1解码为UTF-8?

时间:2018-10-31 10:21:46

标签: node.js utf-8 character-encoding iconv

我正在以ISO-8859-1查询数据库,但是由于节点以UTF8模式运行,因此我必须将返回的数据转换为此特定的DBMS。

我尝试了iconv,但是我不知道如何获得所需的输出。 例如,当我期望返回0xe2 0x82 0xac时,我得到了0xc2 0x80。

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 :(得分:1)

由于上面的评论,我意识到,尽管我的数据库中有一个字符集“ ISO8859_1”,但是IBEXPERT还是在使用并以WINDOWS-1252(称为ANSI)编码向我展示数据,这解释了为什么我在他们的HEX查看器中看到了0x80。

也许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表示,如符号值所示就是“”,翻译为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”     } ...