【问题标题】:Node.JS how to decode ISO-8859-1 into UTF-8?Node.JS 如何将 ISO-8859-1 解码为 UTF-8?
【发布时间】:2018-10-31 10:21:45
【问题描述】:

我正在查询 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
  • 如 cmets ISO-8859-1 中所述,不包含 € 字符。

【问题讨论】:

  • '在 UTF8 中,€ 用 0xDB 表示' 不,是0xe2 0x82 0xac。另一方面,0xc2 0x80 是一个控制字符,有时会呈现 有点像 € ()。 ISO 8859-1 甚至没有欧元。
  • ...您正在尝试转换不存在的东西。您确定源编码吗? ISO 8859-15 有一个 €,但它位于 0xa5。一些 Windows 编码,例如windows-1252/latin10x80 有€。
  • 数据库列是 ISO-8859-1,这也是默认的 dB 编码。使用 ibexpert 检查数据,我看到 € 在十六进制查看器中被表示为 0x80
  • 仅供参考:ISO-8859-1(也称为 latin1)。没有欧元。 0x80 未定义。
  • 维基百科页面有一个有趣的花絮:'Windows-1252 代码页与 ISO-8859-1 一致,除了范围 128 到 159(十六进制 80 到 9F)之外,其中很少使用的 C1 控件被替换为附加字符,包括 ISO-8859-15 提供的所有缺失字符。错误地将 Windows-1252 文本标记为 ISO-8859-1 是很常见的。'

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


【解决方案1】:

感谢上面的 cmets,我意识到尽管我的数据库中有一个字符集“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') 返回

... “默认货币”:{ "id": "欧元", "symbol": "€", “标签”:“欧元” }...

【讨论】:

    猜你喜欢
    • 2014-11-19
    • 1970-01-01
    • 2011-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-21
    • 2012-01-05
    相关资源
    最近更新 更多