正确的解决方案,包括空格:
use open ':std', ':encoding(UTF-8)';
use Encode;
my $escaped = '%41F%2F%424+%41F%41E%414%416%410%420%41A%410+%418%417+%421%412%418%41D';
(my $unescaped = $escaped) =~ s/\+/ /g;
$unescaped =~ s/%([[:xdigit:]]+)/chr hex $1/eg;
print $unescaped;
# П/Ф ПОДЖАРКА ИЗ СВИН
归功于 Renaud Bompuis首次认识到这些是以 . 为前缀的 Unicode 代码点%
。
我想补充一点,问题中的编码方案非常不寻常,我以前从未见过。通常人们会期望字符串П/Ф ПОДЖАРКА ИЗ СВИН
被编码为%D0%9F%2F%D0%A4+%D0%9F%D0%9E%D0%94%D0%96%D0%90%D0%A0%D0%9A%D0%90+%D0%98%D0%97+%D0%A1%D0%92%D0%98%D0%9D
,也就是说,首先将字符编码为 UTF-8,然后对八位字节进行百分比转义。该方案适用于Dr.Kameleon的答案。