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