使用Perl的URI::Escape转义URL时保留字符未生效的问题咨询
Perl实现URL转义:保留URI结构+简化单命令
问题1:为什么:/等保留字符被转义?
uri_escape函数默认仅保留A-Za-z0-9-_.~这类非保留字符,所有其他字符(包括URI规范中定义的保留字符如:/?#[]@等)都会被转义。文档中提到的“保留字符”是URI规范里有特殊含义的字符,但uri_escape本身不会自动区分这些,必须手动指定第二个参数来排除不需要转义的字符。
如果要保留URI结构里的:/和/,只需给uri_escape传入第二个参数,明确指定不转义的字符集合:
#!/usr/bin/perl use URI::Escape; my $string = "https://aá-brø.com/sub/index.php"; my $encode = uri_escape($string, ':/'); print $encode;
执行后输出就会符合预期:
https://a%C3%A1-br%C3%B8.com/sub/index.php
问题2:更简洁的单命令实现
方式1:优化uri_escape命令
直接在命令行指定不转义字符,同时利用Perl简写语法压缩命令:
perl -MURI::Escape -e 'print uri_escape($ARGV[0], ":/")' "https://aá-brø.com/sub/index.php"
如果需要处理管道输入(比如从其他命令传递字符串),可以写成:
echo "https://aá-brø.com/sub/index.php" | perl -MURI::Escape -ne 'chomp; print uri_escape($_, ":/")'
方式2:用URI模块精准处理URI
如果要严格遵循URI规范,推荐使用URI模块自动解析并重建URI,它会识别URI的各个组成部分(协议、主机、路径等),只转义需要处理的非ASCII或特殊字符,完全保留URI结构:
perl -MURI -e '$u=URI->new($ARGV[0]); print $u->as_string' "https://aá-brø.com/sub/index.php"
内容的提问来源于stack exchange,提问作者Eric
相关产品推荐
相关产品推荐

