有谁知道为什么 perl 的 MessagePack 给出的结果与 Node.js 中的不同。
我正在尝试解压缩使用 Perl 的消息包创建的 msgpack 字符串,但它不起作用
示例:数组 ["a","b","c","d","f"]
将其打包在 Perl 中给出: ��a�b�c�d�e�f
将其打包在 node.js 中(使用各种模块):¡a¡b¡c¡d¡f
有人有线索吗
有谁知道为什么 perl 的 MessagePack 给出的结果与 Node.js 中的不同。
我正在尝试解压缩使用 Perl 的消息包创建的 msgpack 字符串,但它不起作用
示例:数组 ["a","b","c","d","f"]
将其打包在 Perl 中给出: ��a�b�c�d�e�f
将其打包在 node.js 中(使用各种模块):¡a¡b¡c¡d¡f
有人有线索吗
我已经阅读了 msgpack 的规范,因此修改了这个答案。
您在 Node 和 Perl 中编码的数据之间看到的差异仅仅是打印时数据的表示。由于 msgpack 是一种二进制格式,因此您不能只将其打印到终端 - 它不具有代表性,因为数据结构字节不可打印或导致下一个字节被表示为完全不同的东西。
此 perl 脚本输出与 Node 输出相同。轻推 perl 以稍微不同地表示数据,使其看起来与 Node.js 的输出相同。特殊部分是use open qw/:std :utf8/;
,它指示 Perl 将尽可能多的转换为 utf-8 表示形式。我没有测试过 Node,因为 OP 没有定义使用什么包。
#!/usr/env perl
use strict;
use warnings;
use open qw/:std :utf8/;
use Data::Dumper;
use Data::MessagePack;
my $mp = Data::MessagePack->new();
my $packed = $mp->pack([qw(a b c d f)]);
print sprintf("packed: %s\n", $packed);
print Dumper $mp->unpack($packed);
输出如下所示:
packed: ¡a¡b¡c¡d¡f
$VAR1 = [
'a',
'b',
'c',
'd',
'f'
];
在我的终端中,打包字符串的开头有一个零宽度字符。该字符不粘贴。我最初认为这是一个 utf-8 BOM,但在检查了 msgpack 规范后,发现这是二进制消息的一部分。
我想要实现的是以下内容: 有一个 perl 脚本将 msgpack 写入 Redis DB,但没有 utf8 编码。然后我需要使用 node.js 获取值并将其解压缩。我还需要 perl 脚本能够从 db 获取值并将其解压缩
如果我在 Perl 中使用
use strict;
use warnings;
use Data::MessagePack;
use Encode;
my $mp = Data::MessagePack->new();
my $packed = $mp->pack([qw(a b c d f)]);
print "packed:".$packed."\n";
my $encoded = Encode::encode_utf8($packed);
print "packed encoded using encode_utf8 :".$encoded."\n";
my $decoded = Encode::decode_utf8($encoded);
print "packed decoded using decode_utf8:".$decoded."\n";
my $unpacked = $mp->unpack($decoded);
print $unpacked."\n";
输出为: packed:��a�b�c�d�f
使用 encode_utf8 打包编码:¡a¡b¡c¡d¡f
打包解码使用 decode_utf8:��a�b�c�d�f
Data::MessagePack->unpack: /home/myname/workspace/test/test_msgpack.pl 第 29 行的额外字节。
因此,我要么之前不转换 utf8 中的 perl 中的任何内容,而是将其发送到 db,以便 node.js 完成其余工作,但它还需要将数据转换为 perl 可以理解的格式以便解包。
或者
我没有在 node.js 中做任何事情,但是通过使用任何存在的 msgpack 模块,我解包消息以进行处理,并将其打包并保存到 db 以供 Perl 获取和解包。
在第二个选项中,我遇到了上述问题
Data::MessagePack->unpack: extra bytes at /home/myname/workspace/test/test_msgpack.pl line 29.
并且在第一个解决方案中 node.js 不理解 perl 保存到 db 的 msgpack 的格式