【发布时间】: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/latin1 在0x80有€。 -
数据库列是 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