使用perl但保留字符的转义URL无效

91zkwejq  于 2023-10-24  发布在  Perl
关注(0)|答案(3)|浏览(150)

我试图使用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"
vdzxcuhz

vdzxcuhz1#

引用URI::Escape的文档:
要转义的默认字符集是所有不属于上面显示的非保留字符类的字符以及保留字符。即,默认值为:

"^A-Za-z0-9\-\._~"

如果你想把:/视为安全的,你必须明确地说出来,即:

my $unsafe = "^A-Za-z0-9\-\._~:/";  
my $encode = uri_escape($string, $unsafe);
6jygbczu

6jygbczu2#

如果你只是想转义host,你想在这里使用punycode吗?主要的浏览器都支持这种方式,将带有宽字符的host(并且只有host)编码为ASCII。并且,Perl中的主要URI处理模块已经支持它:

use utf8;
use v5.10;

use Mojo::URL;

my $url = Mojo::URL->new( "https://aá-brø.com/sub/index.php" );
say $url;

输出如下所示:

https://xn--a-br-5na5l.com/sub/index.php
dgsult0t

dgsult0t3#

你把"URL encoding""hostname encoding" (IDN混在一起了)!
uri_escape不会改变主机名,如果它这样做了,它将无法工作(作为URI)。

相关问题