标签: perl encoding
我对以下区别感到困惑。
$str="\xd6\xd0"; decode("GBK",$str);
VS
$str="d6d0"; @list=map "\\x".$_,unpack("(a2)*", $str); $str=join "", @list; decode("GBK",$str);
为什么在第一种情况下,它可以打印出字符,而在第二种情况下,它不起作用?如何在后一种情况下使其工作?
非常感谢。
答案 0 :(得分:5)
如果您尝试将"d6d0"变为"\xd6\xd0",则需要pack 'H*':
"d6d0"
"\xd6\xd0"
pack 'H*'
my $str = "d6d0"; $str = pack('H*', $str); decode("GBK",$str);
join不解释转义序列,它只是连接字符串。
join
答案 1 :(得分:2)
在第一种情况下,解析器解释转义序列并构建一个两个字节长的字符串。在第二种情况下,您将创建一个包含八个字符的字符串: \xd6\xd0。你可能想要像你正在做的那样解压缩,但不要先加\x,然后使用pack和模板(H2)*而不是加入来把它们放在一起。
\xd6\xd0
\x
pack
(H2)*