Thread Catalyst character encoding Latin-1 zu UTF-8 (24 answers)
Opened by cbxk1xg at 2016-12-03 19:24

cbxk1xg
 2016-12-03 19:24
#185701 #185701
User since
2003-10-20
496 Artikel
BenutzerIn
[default_avatar]
Hi!

Ich breche mir seit ein paar Tage die Finger an folgendem Problem.

Ich habe eine Catalyst-App die auf einem Debian 8 (64 Bit) läuft. Die App hat die Aufgabe zunächst auf einem Endpoint Daten via GET oder POST (Is' mir Wurscht) entgegen zunehmen. Die Daten kommen von einem Radio-Broadcast-System welches auf Windows 7 (64 Bit) läuft. Die App soll nach einigen anderen Dingen mit ein paar APIs telefonieren und dann am Ende UTF-8 Content in eine Datenbank schreiben und JSON als Antwort auf die HTTP-Requests liefern. - Das funktioniert auch ganz nett. Allerdings immer nur bis zu nächsten öäüß etc. Leider kann der Client die Ausgabe meiner App gar nicht verarbeiten. Ich sehe also die Antwort von meiner App leider nicht im Broadcast-System. Alles was ich sehe ist ein Eintrag im Protokoll des Broadcast-Systems, daß ein (man weiß aber nie welcher) Request mit dem Status 400 fehlschlug. Das Teil setzt halt nur stumpf seine HTTP-Requests ab. Das erschwert natürlich die Fehlersuche.

Ich habe mir ein kleines CGI-Script geschrieben um herauszubekommen, was mir das Broadcast-System als Anfrage schickt.

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
57
##!/usr/bin/perl

use strict;
use warnings;
use utf8;
use Data::Dumper;
use CGI;
use Encode qw( encode decode );

my $File = "/var/www/htdocs/DumperFile.dat";


my $query = new CGI();
print $query->header(-type=>'text/html', -charset=>'utf-8');
my @names = $query->param;
my $queryParams = "";  


my $savedDumpFile = writeFile(@names);
printOutput(@names);
exit;


sub printOutput {
        my @names = @_;
        my $queryParams = "";

        print "saved mairlist dumper-file: ".$File."\n" if ($savedDumpFile == 1);

        for my $name ( @names ) {
                if ( $name =~ /\_/ ) { next; }
                else { $queryParams .= $name."\t\t".$query->param($name)."\n"; }
        }

        my $utf8 = $queryParams;
        print Dumper($utf8)."\n";
        return 1;
}


sub writeFile {
        my @names = @_;
        my $queryParams = "";

        open(FILE, ">>$File") || die ("Could not open file");

        for my $name ( @names ) {
                if ( $name =~ /\_/ ) { next; }
                else { $queryParams .= $name."\t\t".$query->param($name)."\n"; }
        }

        print FILE Dumper($queryParams)."\n";
        close( FILE ) || die("Could not close file");
        return 1;
}

# EOF


DumperFile.dat
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$VAR1 = 'action		start
artist HP
filePath D:/some/path/HP - Früher War Alles Besser [Dezember 2013]/HP - (Früher War Alles Besser 01).mp3
timestampStart 2016-12-03 01:49:10
title Früher War Alles Besser 01 öäüß
type Promo
totalTime 00:00:31
';

$VAR1 = 'action stop
artist Lady Antebellum
filePath D:/some/path/Lady Antebellum - All I Want For Christmas Is You -- 2012.mp3
timestampStart 2016-12-03 01:49:12
title All I Want For Christmas Is You -- 2012
type Music
totalTime 00:03:35
';



Wenn ich das Dump-File mit meiner IDE unter Linux öffne, sehe ich als Encoding Latin-1. Der gleiche Request von einer Linux-Machine zum Test-Script, ergibt am Ende ein Dump-File mit UTF-8 encoding.

Meine Catalyst-App antwortet also leider immer mit einem HTTP-Status Code 400, wenn ein Latin-1 Sonderzeichen (öäüß) im Request vorkommt. Und ich wüsste nun sehr gerne wie ich meiner App beibringen kann, mit einen Request das kein UTF-8 Encoding enthält, umgehen zu können. Ich würde gerne das Latin-1 in brauchbares UTF-8 transcodieren.

Der in Catalyst eingebaute Webserver wirft auf der Shell folgende Fehlermeldung.
Code: (dl )
[error]Caught exception in engine "utf8 "\xF6" does not map to Unicode at /usr/local/share/perl/5.20.2/Catalyst.pm line 3662."


Soweit ich es verstanden habe versucht Catalyst das Encoding zu fixen, hängt sich aber daran auf.


Hat jemand 'ne Idee???


Grüße aus dem nasskalten Berlin!
cbx

Editiert von cbxk1xg: weniger Tabs im Code.
Last edited: 2016-12-05 00:26:54 +0100 (CET)

View full thread Catalyst character encoding Latin-1 zu UTF-8