我正在以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>*/
更新:
答案 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” } ...