使用Perl,如何在网络上解码或创建那些%-encodings?

per*_*faq 13 perl url-encoding percent-encoding

我需要在Perl脚本中处理URI(即百分比)编码和解码.我怎么做?


这是来自官方perlfaq的问题.我们将perlfaq导入Stack Overflow.

per*_*faq 20

这是正式的FAQ答案减去后续编辑.

这些%编码处理URI中的保留字符,如RFC 2396第2节中所述.此编码使用US-ASCII表中字符编号的十六进制表示替换保留字符.例如,冒号:变成了%3A.

在CGI脚本中,如果使用CGI.pm,则不必担心解码URI .你不应该自己处理URI,无论是在进出路上还是出路.

如果您必须自己编码一个字符串,请记住,您永远不应该尝试编码已经组合的URI.您需要单独转义组件然后将它们放在一起.要对字符串进行编码,可以使用URI :: Escape模块.该uri_escape函数返回转义字符串:

my $original = "Colon : Hash # Percent %";

my $escaped = uri_escape( $original );

print "$escaped\n"; # 'Colon%20%3A%20Hash%20%23%20Percent%20%25'
Run Code Online (Sandbox Code Playgroud)

要解码字符串,请使用uri_unescape函数:

my $unescaped = uri_unescape( $escaped );

print $unescaped; # back to original
Run Code Online (Sandbox Code Playgroud)

如果你想自己做,你只需要用它们的编码替换保留字符.全球替代是一种方法:

# encode
$string =~ s/([^^A-Za-z0-9\-_.!~*'()])/ sprintf "%%%0x", ord $1 /eg;

#decode
$string =~ s/%([A-Fa-f\d]{2})/chr hex $1/eg;
Run Code Online (Sandbox Code Playgroud)


小智 5

DIY编码(改进以上版本):

$string =~ s/([^^A-Za-z0-9\-_.!~*'()])/ sprintf "%%%02x", ord $1 /eg;
Run Code Online (Sandbox Code Playgroud)

(注意“%02x”而不仅仅是“%0x”)

DIY 解码(添加 '+' -> ' '):

$string =~ s/\+/ /g; $string =~ s/%([A-Fa-f\d]{2})/chr hex $1/eg;
Run Code Online (Sandbox Code Playgroud)

编码员帮助编码员 - 交换知识!