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)
编码员帮助编码员 - 交换知识!