Thread Catalyst character encoding Latin-1 zu UTF-8
(24 answers)
Opened by cbxk1xg at 2016-12-03 19:24
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 $VAR1 = 'action start 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) |