好的,感谢您显示完整的代码。问题是您将 的内容$body
作为 URL 参数传递,因此 HTTP 协议需要转义各种字符才能正确传递它们。
您可以使用该模块来实现这一点URI::Escape
,并且您将不再需要像在第 125 行和后面的行中那样进行清理# clean the body
。
该程序使用包含您已识别的所有问题字符的字符串,并使用模块对其进行翻译。如果uri_escape
在将内容$body
附加到 Curl 的 URL 之前使用它,那么一切都应该正常工作。
use strict;
use warnings;
use URI::Escape 'uri_escape';
my $body = '%localappdata% â & ';
print uri_escape $body;
输出
%25localappdata%25%20%E2%20%26%20
更新
对于一般的 URL 操作,最好使用该URI
模块,该模块将为您在 URL 的路径和查询部分进行所有必要的转义。
下面的程序显示了如何$curl->setopt
使用此方法生成您需要传递给的 URL
use strict;
use warnings;
use URI;
my $url = URI->new('https://this/is/the/url');
my $body = '%localappdata% â & ';
$url->query_form(body => $body);
print $url, "\n";
输出
https://this/is/the/url?body=%25localappdata%25+%E2+%26+
(请注意,此方法使用空格字符+
而不是%20
空格字符。在 URL 的查询部分中任何一个都可以接受。)
这个 URL 可以通过写直接设置为 Curl 选项
$curl->setopt(CURLOPT_URL, $url);