Thread JSON UTF decode (46 answers)
Opened by bianca at 2013-06-17 06:12

bianca
 2013-06-18 06:50
#168403 #168403
User since
2009-09-13
6977 Artikel
BenutzerIn

user image
2013-06-17T20:03:11 GwenDragon
Code (perl): (dl )
$bank = Encode::encode('ISO-8859-15',$bank);

Bist ein Goldschatz! Das klappt bei mir tatsächlich auch.
Aber es nützt mir nichts *wein*.

Ich habe die Kommunikation in einer sub gekapselt und dort sollen die Daten komplett fertig in ISO-8859-15 (das Euro Zeichen haben wir zum Test extra eingebaut, das wäre ich als nächstes angegangen, wollte es jetzt erstmal mit Latin1 hinbekommen, um Fehler im Zusammenhang mit ISO-8859-15 auszuschließen, was vielleicht auch nicht jedes Modul kennt) zurück geben. Das Encodieren von $ref->{content}[-1]{bankname} ist schon Anwendungsebene, dort sollen keine Zeichencodierungen mehr stattfinden.

Aber jeder Versuch, die Daten einen Schritt früher zu encodieren scheitert. Es kommen immer irgendwelche Sonderzeichen raus.
Funktioniert bei dir das Encodieren auch einen Schritt früher?
Also entweder komplett auf $response->content bezogen oder bei der Zerlegung durch JSON?

Habe mal was zum Testen vorbereitet:
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
#!/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);
    }
}
10 print "Hallo"
20 goto 10

View full thread JSON UTF decode