Это официальный ответ на часто задаваемые вопросы минус последующие правки.
Эти %
кодировки обрабатывают зарезервированные символы в URI, как описано в RFC 2396, раздел 2 . Эта кодировка заменяет зарезервированный символ шестнадцатеричным представлением номера символа из таблицы US-ASCII. Например, двоеточие :
становится %3A
.
В CGI-скриптах вам не нужно беспокоиться о декодировании URI, если вы используете CGI.pm . Вы не должны обрабатывать URI самостоятельно, ни при входе, ни при выходе.
Если вам нужно кодировать строку самостоятельно, помните, что вы никогда не должны пытаться кодировать уже составленный URI. Вы должны избежать компонентов по отдельности, а затем собрать их вместе. Для кодирования строки вы можете использовать модуль URI :: Escape . Функция uri_escape
возвращает экранированную строку:
my $original = "Colon : Hash # Percent %";
my $escaped = uri_escape( $original );
print "$escaped\n"; # 'Colon%20%3A%20Hash%20%23%20Percent%20%25'
Чтобы декодировать строку, используйте функцию uri_unescape:
my $unescaped = uri_unescape( $escaped );
print $unescaped; # back to original
Если вы хотите сделать это самостоятельно, вам просто нужно заменить зарезервированные символы их кодировками. Глобальная замена - один из способов сделать это:
# encode
$string =~ s/([^^A-Za-z0-9\-_.!~*'()])/ sprintf "%%%0x", ord $1 /eg;
#decode
$string =~ s/%([A-Fa-f\d]{2})/chr hex $1/eg;