5

我正在尝试显示 (237) 中的í字符0xed

String.fromCharCode产生正确的结果:

String.fromCharCode(0xed); // 'í'

但是,当使用Buffer:

var buf = new Buffer(1);
buf.writeUInt8(0xed,0); // <Buffer ed>
buf.toString('utf8'); // '?', same as buf.toString()
buf.toString('binary'); // 'í'

Buffer.toString推荐使用“二进制”,所以我想避免这种情况。

其次,我还可以期望传入的数据是多字节的(即 UTF-8),例如:

String.fromCharCode(0x0512); // Ԓ - correct
var buf = new Buffer(2);
buf.writeUInt16LE(0x0512,0); // <Buffer 12 05>, [0x0512 & 0xff, 0x0512 >> 8]
buf.toString('utf8'); // Ԓ - correct
buf.toString('binary'); // Ô

请注意,这两个示例都不一致。

所以,我错过了什么?我在假设我不应该做什么?很String.fromCharCode神奇吗?

4

1 回答 1

7

似乎您可能假设Strings 和Buffers 使用相同的位长和编码。

JavaScriptString16 位 UTF-16 序列,而 NodeBuffer是 8 位序列。

UTF-8 也是一种可变字节长度编码,代码点占用1 到 6 个字节。例如 的 UTF-8 编码í需要 2 个字节:

> new Buffer('í', 'utf8')
<Buffer c3 ad>

而且,就其本身而言,0xed它不是 UTF-8 编码中的有效字节,因此?表示“未知字符”。但是,它是一个有效的 UTF-16 代码,可用于String.fromCharCode().

此外,您为第二个示例建议的输出似乎不正确。

var buf = new Buffer(2);
buf.writeUInt16LE(0x0512, 0);
console.log(buf.toString('utf8')); // "\u0012\u0005"

您可以绕道String.fromCharCode()查看 UTF-8 编码。

var buf = new Buffer(String.fromCharCode(0x0512), 'utf8');
console.log(buf); // <Buffer d4 92>
于 2013-08-22T02:41:37.333 回答