URIs kodieren und dekodieren mit URI::Escape
Veröffentlicht von Thomas Fahle am (Permalink)
Bei einer URL- oder URI-Kodierung geht es darum, bestimmte Zeichen in einer URL (URI) durch eine oder mehrere Gruppen aus speziellen anderen Zeichen zu ersetzen.
URI::Escape von Gisle Aas erleichtert das Kodieren bzw. Dekodieren von URIs erheblich und bietet neben UTF8-Unterstützung auch Sicherheitsfeatures.
Beispiel: URI kodieren und dekodieren
Die beiden Subroutinen uri_escape() und uri_unescape(), die automatisch von URI::Escape exportiert werden, übernehmen die Arbeit.
#!/usr/bin/perl use warnings; use strict; use URI::Escape; my $klartext = qq~"Dies ist Klartext mit Sonderzeichen!" 10% mehr \$ ... ~; my $encoded = uri_escape($klartext); my $decoded = uri_unescape($encoded); print "Encoded: $encoded \n"; print "Decoded: $decoded \n";
Das Programm erzeugt folgende Ausgabe:
Encoded: %22Dies%20ist%20Klartext%20mit%20Sonderzeichen!%22%20%2010%25%20mehr%20%24%20...%20 Decoded: "Dies ist Klartext mit Sonderzeichen!" 10% mehr $ ...
UTF8
uri_escape_utf8() kann UTF8 Strings kodieren, uri_unescape() kann diese ebenfalls dekodieren.
CGI-Formulare
Das Modul CGI kodiert bzw. dekodiert Formulardaten automatisch richtig. Verwenden Sie daher CGI und nicht URI::Escape.
Beispiel: GET-Query mit URI::Escape zusammensetzen
#!/usr/bin/perl use strict; use warnings; use URI::Escape; # Basis URI zum Formular my $url = 'http://irgendwo.tld/cgi-bin/formular.pl'; # Parameter und Werte my $param1 = 'vorname'; my $param2 = 'nachname'; my $value1 = 'Max'; my $value2 = 'Müller'; # Get Query schrittweise zusammenbauen my $get_query = ''; $get_query .= $url; $get_query .= '?'; $param1 = uri_escape($param1); $get_query .= $param1; $get_query .= '='; $value1 = uri_escape($value1); $get_query .= $value1; $get_query .= '&'; $param2 = uri_escape($param2); $get_query .= $param2; $get_query .= '='; $value2 = uri_escape($value2); $get_query .= $value2; print "GET Query: $get_query\n";
Das Programm erzeugt folgende Ausgabe:
GET Query: http://irgendwo.tld/cgi-bin/formular.pl?vorname=Max&nachname=M%C3%BCller
Beispiel: GET-Query mit CGI zusammensetzen
Zum Vergleich die selben Schritte wie oben, jedoch mit CGI.
#!/usr/bin/perl use strict; use warnings; use CGI; my $q = new CGI; # Basis URI zum Formular my $url = 'http://irgendwo.tld/cgi-bin/formular.pl'; # Parameter und Werte my $param1 = 'vorname'; my $param2 = 'nachname'; my $value1 = 'Max'; my $value2 = 'Müller'; # Get Query schrittweise zusammenbauen my $get_query = ''; $get_query .= $url; $get_query .= '?'; $param1 = $q->escape($param1); $get_query .= $param1; $get_query .= '='; $value1 = $q->escape($value1); $get_query .= $value1; $get_query .= '&'; $param2 = $q->escape($param2); $get_query .= $param2; $get_query .= '='; $value2 = $q->escape($value2); $get_query .= $value2; print "GET Query: $get_query\n";
Das Programm erzeugt die selbe Ausgabe wie oben:
GET Query: http://irgendwo.tld/cgi-bin/formular.pl?vorname=Max&nachname=M%C3%BCller
Tabellarische Übersicht URL Escape Codes
Zeichen | Escape Code |
Space | %20 |
" | %22 |
! | %23 |
. | %2E |
, | %2C |
< | %3C |
> | %3E |
# | %23 |
% | %25 |
( | %28 |
) | %29 |
{ | %7B |
} | %7D |
| | %7C |
\ | %74 |
^ | %5E |
~ | %7E |
[ | %5B |
] | %5D |
' | %60 |
; | %3B |
/ | %2F |
? | %3F |
: | %3A |
@ | %40 |
= | %3D |
& | %26 |
* | %2A |