1 2 3
my $content = $response->content; my $ref = JSON->new->utf8->decode($content); print Dumper($ref);
2013-06-17T06:17:56 RaubtierDas kommt ja darauf an, auf was deine Ausgabe erfolgt.
2013-06-17T06:24:48 RaubtierVermutlich willst du endoce("utf8", $string) haben.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
#!/usr/bin/perl use strict; use warnings; use Data::Dumper; use JSON; use LWP::UserAgent; delete @ENV{ qw(ENV BASH_ENV IFS PATH) }; # make safe! my $ua = LWP::UserAgent->new(); my $response = $ua->get('http://labs.gwendragon.de/tmp/x.json'); my $content = $response->content; $Data::Dumper::Useperl = 1; print Dumper($content); my $ref = JSON->new->utf8->decode($content); print Dumper($ref);
2013-06-17T13:36:00 GwenDragonWas ist bei mir anders? Dass das Dumperegebnis es als Köln angezeigt wird?
2013-06-17T13:36:00 GwenDragonWie ist denn deine Codepage auf der DOS-Konsole?
2013-06-17T13:36:00 GwenDragonIch weiß ja nicht, ob deine 5.10.1-Module alle per CPAN aktuell sind.
2013-06-17T17:09:48 bianca2013-06-17T13:36:00 GwenDragonWie ist denn deine Codepage auf der DOS-Konsole?
Falls es relevant dafür ist: 850
Will sagen, Script läuft nicht in der DOS-Box sondern über lokalen Webserver. Denn dass man darin komische Umlaute angezeigt bekommt ist mir klar.
2013-06-17T17:34:26 GUIfreundWenn du in der DOS-Box Umlaute sehen willst, solltest du auf Codepage 1252 umschalten. Siehe msg #168351.
2013-06-17T17:35:32 bianca2013-06-17T17:34:26 GUIfreundWenn du in der DOS-Box Umlaute sehen willst, solltest du auf Codepage 1252 umschalten. Siehe msg #168351.
Will ich garnicht. Es muss ja über Webserver laufen.
QuoteScript läuft nicht in der DOS-Box sondern über lokalen Webserver. Denn dass man darin komische Umlaute angezeigt bekommt ist mir klar.
2013-06-17T14:35:23 MuffiDu kannst ja auch selber mal probieren an was es liegen könnte.
2013-06-17T14:35:23 MuffiDa dein 'ö' augenscheinlich aus 2 Charactern besteht wär mein erster Gedanke wohl, dass es trotz decode in Wirklichkeit immer noch eine utf8-wurscht ist.
2013-06-17T14:35:23 MuffiAls nächstes könnte man ja testen, ob der decode vielleicht nicht tut und das Ganze mal ohne decode ausprobieren.
QuoteWelches decode genau meinst du, was ich weglassen soll?
2013-06-18T06:54:01 MuffiIch seh in der einen Zeile Source, die du gepostet hast nur ein decode.
2013-06-17T17:42:14 GwenDragonWenn du ISO-8859-1 brauchst, muss du von UTF-8 auf Latin zurück kodieren.
Mit Encode.
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
#!/usr/bin/perl require 5.010_001; use strict; use warnings; use lib '.'; use Data::Dumper; use JSON; use LWP::UserAgent 6.03; use CGI (); use Encode; my $inhalt; my $url = 'https://dev.sepatools.eu/supported_banks.json'; my $ua = LWP::UserAgent->new(); #$ua->add_handler("request_send", sub { shift->dump; return }); #$ua->add_handler("response_done", sub { shift->dump; return }); $ua->ssl_opts('verify_hostname' => 0); $ua->credentials('dev.sepatools.eu:443',"dev.sepatools.eu",'dtest','8cd9cddec4cdf6780211e4c51d2f287befdff9b7'); my $response = $ua->get($url); if ($response->is_success) { my $content = $response->content; my $ref = JSON->new->decode($content); # Kr€issparkass€ Köln my $bank = $ref->{content}[-1]{bankname}; $bank = Encode::encode('ISO-8859-15',$bank); $inhalt = "Ergebnis:<br><pre>$bank</pre>"; } else { $inhalt = 'Fehler: "'.($response->status_line).'"'; } my $cgi = CGI->new(); print $cgi->header( -content_type => 'text/html', -charset => 'ISO-8859-15' ),$inhalt;
2013-06-17T20:03:11 GwenDragonCode (perl): (dl )$bank = Encode::encode('ISO-8859-15',$bank);
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
#!/usr/bin/perl require 5.010_001; use strict; use warnings; use lib '.'; use Data::Dumper; use JSON; use LWP::UserAgent 6.03; use CGI (); use Encode; my ($inhalt,%cb); comm(\%cb); # hier oben sind keine encodierungen erwünscht foreach my $ref (@{$cb{data}{content}}) { # $inhalt .= Encode::encode('ISO-8859-15',$ref->{bankname})."<br>\n"; # bringt sauber alle Umlaute raus, auch € $inhalt .= $ref->{bankname}."<br>\n"; } my $cgi = CGI->new(); print $cgi->header( -content_type => 'text/html', -charset => 'ISO-8859-15' ),$inhalt ; sub comm { my ($cb) = @_; my $url = 'https://dev.sepatools.eu/supported_banks.json'; my $ua = LWP::UserAgent->new(); $ua->credentials('dev.sepatools.eu:443',"dev.sepatools.eu",'dtest','8cd9cddec4cdf6780211e4c51d2f287befdff9b7'); my $response = $ua->get($url); if ($response->is_success) { # my $content = $response->content; my $content = Encode::encode('ISO-8859-15',$response->content); # bringt Köln # $cb->{data} = JSON->new->utf8->decode($content); # bringt auch Köln $cb->{data} = JSON->new->decode($content); } }
2013-06-18T07:03:28 MuffiWarum geht das bei dir nicht?
2013-06-18T07:44:19 MuffiDu musst das in 2 Schritten machen.
decode von utf8 nach perlstring
encode von perlstring nach iso.
2013-06-18T07:44:19 MuffiAllerdings, wirklich, ich würd nicht mit iso im Programm arbeiten. Mach die Konvertierung nach iso so spät (wenns die Ausgabe so braucht, dann eben beim Übergeben an die Ausgabe) wie möglich.
Du fängst dir sonst nur Ärger ein.
my $content = Encode::encode('ISO-8859-15',Encode::decode('utf8', $response->content))
2013-06-18T07:53:57 MuffiIch würd mal das probieren
Code (perl): (dl )my $content = Encode::encode('ISO-8859-15',Encode::decode('utf8', $response->content))
2013-06-18T08:11:28 MuffiHmm, und wie schaut der content vor dem JSON aus?
2013-06-18T08:11:28 MuffiFalls er da noch gut ausschaut ist das genau der Ärger von dem ich gesprochen hab.
2013-06-18T13:06:23 GwenDragonIch nehme mal an, du brauchst aus dem JSON-Hash folgendes: $content->{'content'}
2013-06-18T13:06:23 GwenDragonDa musst du den Hash auslesen und dort drin die Daten mit Encode::encode('ISO-8859-15',...) ändern.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
sub iterate($$) { my ($d, $c) = @_; if(ref $d eq 'ARRAY') { @$d=map{ iterate($_,$c) }@$d; return $d; } if(ref $d eq 'HASH') { while( my ($k,$v) = each %$d ) { $d->{$k}=iterate($v,$c); } return $d; } return $c->($d); }
$content=iterate($content,sub{Encode::encode('ISO-8859-15',$_[0])})
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
sub decode_obj { my $r = $_[0]; if ( ref($r) eq "HASH" ) { for ( keys %$r ) { $r->{$_} = decode_obj( $r->{$_} ); } } elsif ( ( ref($r) eq "ARRAY" ) ) { for ( 0 .. @$r - 1 ) { $r->[$_] = decode_obj( $r->[$_] ); } } unless ( ref($r) ) { # Zeichenkette o. ä. $r = Encode::encode( 'ISO-8859-15', $r ); } return $r; }
2013-06-18T14:48:06 GwenDragonUngetestet
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
sub decode_obj { my ( $in ) = @_; my $out; my @stack=([$in,\$out]); while(@stack) { my ($old,$new) = @{ shift @stack }; if(ref $old eq 'ARRAY') { push(@stack,[ $old->[$_], \$$new->[$_] ]) for (0..$#$old); } elsif(ref $old eq 'HASH') { push(@stack,[ $old->{$_}, \$$new->{$_} ]) for (keys %$old); } else { $$new = Encode::encode( 'ISO-8859-15', $old ); } } return $out; }