【问题标题】:Node.js buf.toString vs String.fromCharCodeNode.js buf.toString 与 String.fromCharCode
【发布时间】:2023-03-10 16:19:01
【问题描述】:

我正在尝试显示来自 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神奇吗?

【问题讨论】:

    标签: node.js character-encoding


    【解决方案1】:

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

    JavaScript Strings 是 16-bit, UTF-16 sequences 而 Node 的 Buffers 是 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>
    

    【讨论】:

    • 我不知道 s4.3.16,所以谢谢你。原来我忽略了二进制数据文件中的编码:它是 ISO-8859-1。 doh 使用 Iconv 我能够成功转码:var v = new Iconv('ISO-8859-1','UTF-8'); v.convert(buf).toString('utf8');.
    猜你喜欢
    • 1970-01-01
    • 2011-01-05
    • 2022-10-04
    • 2015-09-08
    • 2013-02-03
    • 1970-01-01
    • 2023-04-05
    • 2023-03-09
    • 2021-06-26
    相关资源
    最近更新 更多