Ответ 1
Это официальный ответ за минусом последующих изменений.
Те %
encodings обрабатывают зарезервированные символы в URI, как описано в RFC 2396, раздел 2. Эта кодировка заменяет зарезервированный символ шестнадцатеричным представлением номера символа из таблицы US-ASCII. Например, двоеточие, :
, становится %3A
.
В сценариях CGI вам не нужно беспокоиться об декодировании URI, если вы используете CGI.pm. Вам не нужно будет обрабатывать URI самостоятельно, либо по пути, либо по пути.
Если вам нужно самостоятельно закодировать строку, помните, что вы никогда не должны пытаться кодировать уже сконфигурированный URI. Вам нужно убрать компоненты отдельно, а затем собрать их вместе. Чтобы закодировать строку, вы можете использовать модуль URI::Escape. Функция uri_escape
возвращает 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;