我试图使用bash,但似乎需要安装一些软件包,所以我想给给予Perl一个尝试,并希望使用一个干净的,只有一个命令来实现它。
示例代码:
#!/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
实际产量:
https%3A%2F%2Fa%C3%A1-br%C3%B8.com%2Fsub%2Findex.php
我检查了https://metacpan.org/pod/URI::Escape,似乎那些char(:,/,+.. etc)应该被保留,或者我可能错过了什么。
一个命令的解决方案,到目前为止,一个命令是工作。但欢迎分享,如果有缩短的方法。
perl -MURI::Escape -e 'print uri_escape($ARGV[0]);' "https://aá-brø.com/sub/index.php"
3条答案
按热度按时间vdzxcuhz1#
引用URI::Escape的文档:
要转义的默认字符集是所有不属于上面显示的非保留字符类的字符以及保留字符。即,默认值为:
如果你想把
:/
视为安全的,你必须明确地说出来,即:6jygbczu2#
如果你只是想转义host,你想在这里使用punycode吗?主要的浏览器都支持这种方式,将带有宽字符的host(并且只有host)编码为ASCII。并且,Perl中的主要URI处理模块已经支持它:
输出如下所示:
dgsult0t3#
你把"URL encoding"和"hostname encoding" (IDN混在一起了)!
uri_escape
不会改变主机名,如果它这样做了,它将无法工作(作为URI)。