2010-08-19 72 views
1

我試圖在我的URL中實現一些URI編碼的文件名,但是遇到了uri_escape和uri_escape_utf8的一些奇怪問題,它們在表現上不一致。Perl uri_escape_utf8不一致的行爲(或程序員錯誤!)

使用perl的命令行:

[email protected]:$ 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

+2

當我運行你的第一個例子程序時,我得到了引號「_in_a_filename.pdf」。 – daxim 2010-08-19 17:02:18

回答

5

的不安全字符的缺省設置已更改爲那些在RFC 3986中的URI分佈的1.53版本(見Changes文件。不幸的是,它似乎默認字符名單,並沒有在文檔中進行了更新又老集顯:

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

,現在是

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

其中不包含"不安全的字符。我假設您的應用程序正在使用不同的perl解釋器,或者至少爲URI::Escape模塊使用不同的庫位置。有關於您在URI's bugtracker中確切問題的討論。

編輯:如果你想完全一致,我建議你聲明你自己的轉義函數,以明確地傳遞不安全的字符模式。

+0

非常感謝!我曾經想過在我測試的兩種不同環境中URI :: Escape會有所不同,但不確定這是如何可能的,或者爲什麼它會以這種方式不同。我將創建我自己的轉義序列。 再次感謝,R – 2010-08-27 09:45:14