Perl uri_escape_utf8 противоречивое поведение (или ошибка программиста!) - PullRequest
1 голос
/ 19 августа 2010

Я пытаюсь реализовать некоторую URI-кодировку имен файлов в моих URL-адресах, но испытываю некоторые странные проблемы с uri_escape и uri_escape_utf8, где, по-видимому, они ведут себя непоследовательно.1003 *

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 Ответ

6 голосов
/ 19 августа 2010

Набор небезопасных символов по умолчанию был изменен на набор в RFC 3986 в версии 1.53 дистрибутива URI (см. Файл Changes . К сожалению, кажется, что список символов по умолчанию не был обновлен вдокументации пока нет. Старый набор был:

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

и теперь он

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

, что исключает " из небезопасных символов. Я предполагаю, что ваше приложение использует другойинтерпретатор perl или, по крайней мере, другое расположение библиотеки для модуля URI::Escape. Обсудите вашу конкретную проблему в bugtracker URI .

Редактировать: Если вы хотите полной согласованности, ясоветую вам объявить вашу собственную функцию escape, которая явно передает небезопасный шаблон символов.

...