Perl uri_escape_utf8不一致的行为(或程序员错误!)

时间:2010-08-19 16:04:04

标签: perl url escaping

我正在尝试在我的网址中实现文件名的一些URI编码,但是我遇到了一些uri_escape和uri_escape_utf8的奇怪问题,它们的行为似乎不一致。

使用perl命令行:

richard@magic-box:$ perl
use URI::Escape;
print uri_escape_utf8("\"quotes\"_in_a_filename.pdf");
%22quotes%22_in_a_filename.pdf

完美,正是我想要的。然后在我的代码中:

print STDERR uri_escape_utf8("\"quotes\"_in_a_filename.pdf");
print STDERR uri_escape("\"quotes\"_in_a_filename.pdf");

这导致我的应用程序日志文件获得以下行:

"quotes"_in_a_filename.pdf
"quotes"_in_a_filename.pdf

奇怪的是,应用程序中的相同代码可以很好地处理带空格的文件名,并且(例如)正确输出:

my%20pdf%20with%20spaces.pdf

我有点困惑,不知道下一步要寻找解决方案。感谢任何帮助。

干杯,

[R

1 个答案:

答案 0 :(得分:6)

默认的一组不安全字符已更改为URI分发版本1.53中RFC 3986中的那些(请参阅Changes文件。不幸的是,似乎默认字符列表尚未在文档中更新然而,旧的一套是:

^A-Za-z0-9\-_.!~*'()

现在是

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

从不安全的字符中排除"。我假设您的应用程序正在使用不同的perl解释器,或者URI::Escape模块至少使用不同的库位置。在URI's bugtracker中讨论了您的确切问题。

编辑:如果你想要完全一致,我建议你声明你自己的转义函数,它明确地传递了不安全的字符模式。