问题描述
|
我对以下区别感到困惑。
$str=\"\\xd6\\xd0\";
decode(\"GBK\",$str);
与
$str=\"d6d0\";
@list=map \"\\\\x\".$_,unpack(\"(a2)*\",$str);
$str=join \"\",@list;
decode(\"GBK\",$str);
为什么在第一种情况下,它可以打印出字符,而在第二种情况下,它不起作用?在后一种情况下如何使它工作?
非常感谢。
解决方法
如果您要将
\"d6d0\"
变成\"\\xd6\\xd0\"
,则需要pack \'H*\'
:
my $str = \"d6d0\";
$str = pack(\'H*\',$str);
decode(\"GBK\",$str);
join
不解释转义序列,它仅连接字符串。
,在第一种情况下,解析器解释转义序列并构建一个两个字节长的字符串。在第二种情况下,您将创建一个八个字符的字符串:
\\xd6\\xd0
。您可能想像打开包装一样打开包装,但不要在前面加上\\x
,然后再将pack
与模板(H2)*
一起使用,而不是将它们组合在一起。