节点缓冲区,从UTF8到二进制

7
我将从某个来源接收以utf8编码的数据,而原始数据是二进制形式(它是一个Buffer)。我需要将此数据转换回Buffer。我很难弄清楚如何做到这一点。
以下是一个小示例,展示了我的问题:
var hexString = 'e61b08020304e61c09020304e61d0a020304e61e65';
var buffer1 = new Buffer(hexString, 'hex');

var str = buffer1.toString('utf8');
var buffer2 = new Buffer(str, 'utf8');

console.log('original content:', hexString);
console.log('buffer1 contains:', buffer1.toString('hex'));
console.log('buffer2 contains:', buffer2.toString('hex'));

打印

original content: e61b08020304e61c09020304e61d0a020304e61e65
buffer1 contains: e61b08020304e61c09020304e61d0a020304e61e65
buffer2 contains: efbfbd1b08020304efbfbd1c09020304efbfbd1d0a020304efbfbd1e65

我希望buffer2buffer1完全相同。

如何将utf8字符串转换为其原始二进制Buffer


1
避免使用十六进制,尝试在源代码中使用base64.encode(),然后在node.js中使用base64.decode()。例如:"æ"是U+00e6(Unicode),但读作"195 166"(UTF8)。 - Alvin K.
new Buffer()已被弃用。现在这些是类方法,请参阅文档 - rocksteady
关于 utf-8 的文档在哪里?谢谢! - qinggangxu
2个回答

11

你不能期望将二进制数据转换为 utf8 编码,然后再将其转换回来时与原始的二进制数据一致,因为 utf8 的工作方式(特别是当无效的 utf8 字符被替换为 \ufffd 时)。

你必须使用另一种正确保留数据的格式。这可以是“hex”、“base64”、“binary”或某些第三方模块提供的其他二进制安全格式。如果可以的话,显然应该将其保持为缓冲区。


是的,我阅读了一些UTF-8文档和规范,它可以转换数据流!谢谢! - Mike Gleason jr Couturier
@MikeGleasonjrCouturier,请问UTF-8的文档在哪里?谢谢! - qinggangxu

0

被接受的答案是误导性的。你的主要问题是处理无效的UTF-8编码。如果数据是有效的,转换就不会出现问题。

具体来说,取前两个字节:e61b

在二进制中,它是:1110011000011011。这是无效的。看一下utf-8 wikipedia page上的这张图表。

enter image description here

这意味着如果一个字节以 1110 开头,那么下一个字节必须以两个以 10 开头的字节开始。但这里并非如此。

每当js遇到无效字符时,它都会将其替换为 �,即 unicode replacement character。该字符的代码点是U+FFFD,其UTF-8编码为efbfbd。请注意,这在您的输出中出现了多次。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接