msgpack の仕様を読んだので、この回答を修正しました。
Node でエンコードされたデータと Perl でエンコードされたデータの違いは、単純に印刷時のデータの表現にあります。msgpack はバイナリ形式であるため、単に端末に出力することはできません。データ構造のバイトが出力できないか、次のバイトがまったく異なるものとして表現されるため、代表的ではありません。
この perl スクリプトは、ノードの出力と同じものを出力します。データをわずかに異なる方法で表現するように perl を微調整すると、Node.js からの出力と同じように見えます。特別な部分はuse open qw/:std :utf8/;
、可能な限り utf-8 表現に変換するように Perl に指示する です。OPが使用するパッケージを定義していないため、Nodeをテストしていません。
#!/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 の仕様を確認したところ、これはバイナリ メッセージの一部であることがわかりました。