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

Ric*_*d J 1 url perl 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
Run Code Online (Sandbox Code Playgroud)

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

print STDERR uri_escape_utf8("\"quotes\"_in_a_filename.pdf");
print STDERR uri_escape("\"quotes\"_in_a_filename.pdf");
Run Code Online (Sandbox Code Playgroud)

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

"quotes"_in_a_filename.pdf
"quotes"_in_a_filename.pdf
Run Code Online (Sandbox Code Playgroud)

奇怪的是,应用程序中的相同位代码与带空格的文件名完美匹配,并且(例如)正确输出:

my%20pdf%20with%20spaces.pdf
Run Code Online (Sandbox Code Playgroud)

我有些困惑,不知道下一步要寻找解决方案.任何帮助感激不尽.

干杯,

[R

pha*_*lon 6

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

^A-Za-z0-9\-_.!~*'()
Run Code Online (Sandbox Code Playgroud)

它现在是

^A-Za-z0-9\-\._~"
Run Code Online (Sandbox Code Playgroud)

它排除了"不安全的角色.我假设您的应用程序使用不同的perl解释器,或者至少为URI::Escape模块使用不同的库位置.在URI的bugtracker中讨论了你的确切问题.

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