
В PHP есть встроенные функции для кодирования и декодирования строк для URL-ов, но в Perl их нет.
Вот самый простой путь кодирования строк для передачи их в URLы:
$str =~ s/([^A-Za-z0-9])/sprintf("%%%02X", ord($1))/seg;
Теперь можно спокойно подставлять $str в ссылку:
<a ref="file.php?param=$str">Какой-то линк</a>
Декодировать полученную сроку можно так:
$str =~ s/\%([A-Fa-f0-9]{2})/pack('C', hex($1))/seg;
А для ленивых существует специальный модуль URI::Escape.
Подключаем его к проекту:
use URI::Escape;
И кодируем/декодируем URLы функциями uri_escape () и uri_unescape ():
$str = uri_escape("Какая-то строка");
print uri_unescape($str);
Скачать пример
Способ на основе регулярных выражений хорош. Второй способ более красивый, но выдает предупреждение «Parsing of undecoded UTF-8 will give garbage when decoding entities at .../LWP/Protocol.pm line 114». В чем проблема?
При использовании первого и второго варианта выдает предупреждение:
Parsing of undecoded UTF-8 will give garbage when decoding entities at /usr/lib64/perl5/vendor_perl/5.8.8/LWP/Protocol.pm line 114.
Что делать?
Попробуйте сначала применять к данным encode_utf8:
use Encode;
$str = uri_escape (encode_utf8 («Какая-то строка»));
print uri_unescape ($str);