URL mit param: utf8 oder percent encoding

25/09/2010 - 21:17 von Μartin Τrautmann | Report spam
Hallo,

wie kann ich bei der Verwendung von CGI.pm mit URLs arbeiten, die
entweder mit utf8 daherkommen oder das percent-encoding verwenden?

is_utf8 liefert mir immer den Wert 1

my $xx= param('x');
my $xxx = decode utf8=>param('x');

Ein URL mit x=%fczzi liefert xx = ü und xxx = �,
einer mit x=üzzi hingegen zeigt xx = ༠und xxx = ü

is_utf8($xx) ist immer nur "", genauso wie
is_utf8(param('x))

is_utf8($xxx) liefert hingegen immer 1.

Wie mache ich es richtig, damit das Script mit allen URL-Varianten
klarkommt?

Danke,
Martin
 

Lesen sie die antworten

#1 Peter J. Holzer
26/09/2010 - 12:46 | Warnen spam
On 2010-09-25 19:17, Μartin Τrautmann wrote:
wie kann ich bei der Verwendung von CGI.pm mit URLs arbeiten, die
entweder mit utf8 daherkommen oder das percent-encoding verwenden?



Da gibt es kein oder. UTF-8 ist nur gemeinsam mit Percent-Encoding
erlaubt (dein Browser macht das auch fast sicher so, Du siehst es nur in
der URL-Bar nicht).


is_utf8 liefert mir immer den Wert 1

my $xx= param('x');
my $xxx = decode utf8=>param('x');



Die Schreibweise finde ich ziemlich unleserlich. Ich habe eine Weile
gebraucht, um das als

$xxx = decode('utf8', param('x'));

zu identifizieren.


Ein URL mit x=%fczzi liefert xx = ü und xxx = �,
einer mit x=üzzi hingegen zeigt xx = ༠und xxx = ü

is_utf8($xx) ist immer nur "", genauso wie
is_utf8(param('x))

is_utf8($xxx) liefert hingegen immer 1.

Wie mache ich es richtig, damit das Script mit allen URL-Varianten
klarkommt?



Ein konsistentes Schema verwenden. Entweder Du verwendest UTF-8 in URLs,
dann ist die korrekte Kodierung von "üzzi" %C3%BCzzi, oder Du verwendest
Latin-1, dann ist die korrekte Kodierung %FCzzi. Beides zu mischen
bringt nur Kopfweh.

Wenn Du aus irgendeinem Grund (z.B. Links auf externen Sites, Bookmarks,
etc. die Du nicht beeinflussen kannst und von denen Du willst, dass sie
weiter funktionieren), sowohl Latin-1 als auch UTF-8 behandeln musst,
dann kannst Du einen Fallback programmieren:

my $xxx;
eval {
$xxx = decode('utf8', param('x'), Encode::FB_CROAK);
};
if ($@) {
$xxx = decode('iso-8859-1', param('x'), Encode::FB_CROAK);
}

Das funktioniert, weil Latin-1-Strings üblicherweise kein gültiges UTF-8
sind. Falls Du aus irgendeinem Grund doch "à¼" kodieren willst und das
in Latin-1 machst, dann wird das Script das natürlich für ein
UTF-8-kodiertes "ü" halten.

hp

Ähnliche fragen