Thread LWP::UserAgent UTF-8-Mangling die 2991992ste (24 answers)
Opened by Your_name at 2018-10-23 14:29

Gast Your_name
 2018-10-23 14:29
#189006 #189006
Ich sitze an einem UTF-8-System, sage STDOUT und dem Interpreter, dass ich wirklich, nein, WIRKLICH UTF-8 in meinem Skript verwende:

Code (perl): (dl )
1
2
3
4
5
6
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
binmode(STDOUT,':utf8');
print "Blahhhh, blah', blaaaÄÖÜäöüß!\n";


Dann rufe ich eine Funktion auf, die die Dämmlichkeit sämmtlicher Perl-Modulschreiber der Welt in einem eval-Block kapselt und mir stattdessen einen ordentlichen Error-Code plus einen HTTP-Response zurückliefert:

Code (perl): (dl )
1
2
3
4
5
my ($exit,$response) = &get_something
(
    $ua,
    $param
);


"$ua->default_header('Accept-Encoding' => 'gzip');" setze ich manuell, und die Resource, die ich abfrage, ist in UTF-8. "decoded_content" verwende ich nicht, weil die Funktion viel zu fett und lahmarschig ist, Header durchgeht, Speicherallokationen macht und Haste nicht gesehen. Ich *weiß*, dass mir die Gegenseite entweder gar nix oder einen UTF-8-XML-String zurückliefern wird, der vorher vom Server gzipped wurde. Auf gar nix kann ich leicht prüfen, und sonst *müssen keine Header durchgegangen werden* - und daher sollte ich in der Lage sein, nach dem Empfangen des HTTP-Responses einfach das hier zu tun:

Code (perl): (dl )
1
2
gunzip \$response->content => \$content_decoded;
$response->{_content} = \$content_decoded;


Und *trotzdem* halluziniert sich Perl irgendwo herbei, dass dieser UTF-8-String doch eigentlich ein ISO-8859-1-String ist, der nach UTF-8 konvertiert werden muss. Und daher bekomme ich hier auch die herrlichste Mojibake:

Code: (dl )
1
2
3
4
StraÃ<9f>e
ö
Empfänger
überweisen


Ein nachträgliches "decode('utf-8',$response->{_content})" fixt das zwar, und bei der Ausgabe (sowohl in Datei als auch Konsole, denen ich ':utf8' als binmode setze) fixt das auch - aber ahnt mal, *das ist hirnverbrannt*. Der Server sendet mir die Daten in UTF-8 zu, und das soll er auch! Das ist so gewollt! Ich habe hier eine Datenbank, die ich unter Schmerzen auf UTF-8 getrimmt habe, weil die MySQL-Spacken im Jahre 2018 nicht nur standardmässig latin1 für ihre Felder verwenden, sondern UTF-8 auch noch in einer kastrierten 3-Bytes-Max-Pro-Codepoint-Version ausliefern. Da würde ich gerne einfach meine UTF-8-Daten reinpacken, ohne Konvertierung! Hier braucht nie jemand irgendwas zu konvertieren!

Ach, und an der Stelle sollte ich auch sagen, dass es aber überhaupt mal gar keinen Unterschied macht, ob ich manuell den gzip-Header setze und dann über gunzip dekodiere, oder ob ich das einfach weglasse (vom einer Inflation des Payloads mal abgesehen). Selbst dann noch konvertiert mir LWP::UserAgent meinen wunderherrlichen UTF-8-String nochmal in UTF-8 um, weil's davon ausgeht, dass es doch ein ISO-8859-1-String ist.

Fragen:
1. Wie sage ich LWP::UserAgent, dass es den Scheiß lassen soll?
2. Wie sage ich IO::Uncompress::Gunzip, dass es den Scheiß lassen soll?

Disclaimer: ich komme aus der C-Ecke. Da konvertiert mir überhaupt gar keiner meine Strings, ohne dass ich das explizit ansage. Und genauso hätte ich das auch gerne in Perl.

modedit Editiert von GwenDragon: Justiziables in Codezeile 6 entfernt
Nochmals so was und du kannst dir woanders Hilfe suchen!

Last edited: 2018-10-23 16:27:33 +0200 (CEST)

View full thread LWP::UserAgent UTF-8-Mangling die 2991992ste