Leser: 21
ÄÖÜäöüß
%C3%84%C3%96%C3%9C%C3%A4%C3%B6%C3%BC%C3%9F
%C4%D6%DC%E4%F6%FC%DF
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
#!/usr/bin/perl use strict; use warnings; use URI::Escape; use utf8; no utf8; sub say { print @_, "\n" } sub dumphex { my $l = shift; map {sprintf("\\x%x", ord) } split //,$l } my $DEBUG = 0; my $uri; my %testcase = ( 'latin1' => '%C4%D6%DC%E4%F6%FC%DF', 'utf8' => '%C3%84%C3%96%C3%9C%C3%A4%C3%B6%C3%BC%C3%9F' ); sub enc_utf8_to_latin1 { no utf8; my $uri = shift; $uri = uri_unescape($uri); $DEBUG && say $uri; $DEBUG && say dumphex $uri; utf8::decode($uri); $DEBUG && say dumphex $uri; $uri = uri_escape($uri); $DEBUG && say $uri; return $uri; } # ÄÖÜäöüß als UTF-8 URL encoded $uri = $testcase{'utf8'} ); say $uri, " = ÄÖÜäöüß als UTF-8 URL encoded"; say enc_utf8_to_latin1($uri), ' = UTF-8 -> Latin1 dekodiert'; say; # ÄÖÜäöüß ISO-8859-1 URL encoded $uri = $testcase{'latin1'} ); say $uri, ' = ÄÖÜäöüß ISO-8859-1 URL encoded'; say enc_utf8_to_latin1($uri), ' = Latin1 -> Latin1 dekodiert';
2010-05-25T17:33:07 GwenDragonCode: (dl )utf8::decode($uri);
2010-05-25T19:19:27 kristian
QuoteHier wird als sicher angenommen, dass es iso-8859-1 ist, wenn es kein utf-8 ist. Wenn man eine größere Anzahl Webseiten einliest erweist sich das als falsch. iso-8859-1 ist "default" aber kein Zwang.Wenn nicht, war es halt vorher schon Latin-1, und es bleibt Latin-1.
QuoteHier erfolgt die IMHO falsche Annahme Encode::Guess sei eine Lösung, die Bedeutung von "guess" negiert das aber.Ansonsten ist CPAN:Encode::Guess auch noch ein core-Modul
eval { Encode::from_to($uri, 'UTF-8', 'Latin-1', Encode::FB_CROAK); } or die $@;
www.example.com/tags/Ärger
www.example.com/tags/%C3%84rger
www.example.com/tags/%C3%84rger
www.example.com/tags/%C4rger