Thread URL immer auf Latin1 umwandeln (URL-Encoding) (25 answers)
Opened by GwenDragon at 2010-05-25 19:33

GwenDragon
 2010-05-25 19:33
#137596 #137596
User since
2005-01-17
14543 Artikel
Admin1
[Homepage]
user image
Es gibt auf Webseiten seltsame Zeitgenossen, die verwenden keine Links sondern geben die URL in der Adresszeile ein.
Das führt je nach Browser dazu, dass die URL entweder als UTF-8 oder eben wie im Browser fest eingestellt ist, kodiert wird.

Das führt dann dazu, dass beispielsweise in der URL
Code: (dl )
ÄÖÜäöüß
zu
Code: (dl )
%C3%84%C3%96%C3%9C%C3%A4%C3%B6%C3%BC%C3%9F
(also UTF-8) wird.

Wenn aber die Webseite Latin1 (ISO-8859-1) ist, wird ein Dekodieren mit CPAN:URI::Escape der übergebenen URL nicht zum gwünschten
Code: (dl )
%C4%D6%DC%E4%F6%FC%DF
(ÄÖÜ).

Mein Testansatz für eine Umwandlungsfunktion enc_utf8_to_latin1:
Code (perl): (dl )
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';

//EDIT: irritierendes CGI.pm rausgenommen; ändert aber am Grundproblem nichts

Irgendwo eine Denkfalle?
Last edited: 2010-05-26 12:36:46 +0200 (CEST)
die Drachin, Gwendolyn


Unterschiedliche Perl-Versionen auf Windows (fast wie perlbrew) • Meine Perl-Artikel

View full thread URL immer auf Latin1 umwandeln (URL-Encoding)