字符串表示与perl中的值之间的差异

时间:2011-05-24 21:15:06

标签: perl encoding

我对以下区别感到困惑。

$str="\xd6\xd0";
decode("GBK",$str);

VS

$str="d6d0";
@list=map "\\x".$_,unpack("(a2)*", $str);
$str=join "", @list;
decode("GBK",$str);

为什么在第一种情况下,它可以打印出字符,而在第二种情况下,它不起作用?如何在后一种情况下使其工作?

非常感谢。

2 个答案:

答案 0 :(得分:5)

如果您尝试将"d6d0"变为"\xd6\xd0",则需要pack 'H*'

my $str = "d6d0";
$str = pack('H*', $str);
decode("GBK",$str);

join不解释转义序列,它只是连接字符串。

答案 1 :(得分:2)

在第一种情况下,解析器解释转义序列并构建一个两个字节长的字符串。在第二种情况下,您将创建一个包含八个字符的字符串: \xd6\xd0。你可能想要像你正在做的那样解压缩,但不要先加\x,然后使用pack和模板(H2)*而不是加入来把它们放在一起。