将数据转换为引用的单词以转义特殊字符

时间:2012-07-13 15:22:34

标签: perl

在我的Perl程序中,我正在获取加密的电子邮件,对其进行解码并进一步处理。我遇到问题,因为数据包含:%localappdata% 我无法直接使用qw()函数,因为正在从邮箱中提取数据。有没有办法应用这个功能? 我如何使用它,以便特殊字符不被识别为特殊字符而是普通字符?或者有正则表达式吗?

更新:我正在做的处理是将数据转换为HTML并使用Curl将其发送到REST API。

更新2:以下是代码:https://gist.github.com/8cd801fedeb90a5ca7fc $description包含%localappdata%

2 个答案:

答案 0 :(得分:2)

好的,谢谢你展示完整的代码。问题是您将$body的内容作为URL参数传递,因此HTTP protocl需要转义各种字符才能正确传递它们。

您可以使用URI::Escape模块实现此目标,您将不再需要在第125行和# clean the body后面的行进行清理。

此程序使用包含您已识别的所有问题字符的字符串,并使用该模块进行翻译。如果您在uri_escape的内容上使用$body,然后将其附加到Curl的网址,那么一切都应该有用。

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 module,它将在URL的路径和查询部分为您执行所有必要的转义。

下面的程序显示了如何使用此方法生成您需要传递给$curl->setopt的网址

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设置为Curl选项
$curl->setopt(CURLOPT_URL, $url);

答案 1 :(得分:-1)

要逃避某些事情,请使用正则表达式来处理数据:

my $email = "To: foo@example.com\n\nHi Rad,\nI just opened %appdata% and...";
$email =~ s/ % /\\%/xg; # escapes all percent signs

这会将%appdata%替换为\%appdata\%。我不知道您的API如何喜欢其输入数据,请相应调整。

编辑:您将标量$描述放入URL(Git第30和41行)!百分号是那里的逃脱角色!所以只需对你输入任何网址的任何数据s/%/%%/g做一个快乐的事情,然后开心:)