我正在尝试在我的网址中实现文件名的一些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
默认的一组不安全字符已更改为URI分发版本1.53中RFC 3986中的那些字符(请参阅更改文件.不幸的是,似乎默认字符列表尚未在文档中更新.旧集合是:
^A-Za-z0-9\-_.!~*'()
它现在是
^A-Za-z0-9\-\._~"
它排除了"不安全的角色.我假设您的应用程序使用不同的perl解释器,或者至少为URI::Escape模块使用不同的库位置.在URI的bugtracker中讨论了你的确切问题.
编辑:如果你想要完全一致,我建议你声明你自己的转义函数,明确传递不安全的字符模式.