gpt4 book ai didi

Node.js buf.toString 与 String.fromCharCode

转载 作者:搜寻专家 更新时间:2023-10-31 23:02:32 35 4
gpt4 key购买 nike

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

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 一起使用是 deprecated所以我想避免这种情况。

其次,我还可以预期传入数据是多字节的(即 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 是不是很神奇?

最佳答案

您可能假设 StringBuffer 使用相同的位长和编码。

JavaScript String16-bit, UTF-16 sequences而 Node 的 Buffer 是 8 位序列。

UTF-8 也是一种可变字节长度编码,代码点消耗 between 1 and 6 bytes .例如í的UTF-8编码占用2个字节:

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

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

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

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>

关于Node.js buf.toString 与 String.fromCharCode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18370314/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com