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

haj
 2018-10-24 18:34
#189029 #189029
User since
2015-01-07
527 Artikel
BenutzerIn

user image
Das Beispiel ist prima - danke auch dafür, dass Du auch die Testdaten auf Deinem Server bereitstellst!

Ich nehme das zum Anlass, auf zwei Kleinigkeiten hinzuweisen:
  • use utf8 schadet nicht, nutzt aber in diesem Beispiel auch nix.
  • Perls Default-Encoding ist nur auf unixoiden Betriebssystemen Byte-orientiert. In Deinem Hexdump sieht man, dass Windows-Zeilenenden drinstehen (0D 0A). Strawberry Perl auf Windows erzeugt per Default diese zwei-Byte-Sequenz auch aus einem einzelnen "\n". Abhilfe, d.h. "richtige" Byte-Orientierung schafft binmode, was im Code-Beispiel auch drinsteht... so dass mich der Hexdump dann doch wieder etwas überrascht.


Bei der Gelegenheit: Wenn man den LWP::UA machen läßt, dann liefert er in $res->decoded_content einen String aus 199 Perl-Characters. Aus dem Content-Encoding holt er das gzip, und aus dem Content-Type das Encoding UTF-8 - und streicht auch (Überraschung!!) gleich das encoding="UTF8" aus der ersten Zeile so wie das "\n" aus der letzten Zeile raus. Diesen String kann man nun tatsächlich mit open my $out,'>:encoding(UTF-8)','utf8out' in eine Datei schreiben, die sieht dann so aus:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
haj@hajdesktop:~/data/test$ hd utf8out
00000000 3c 3f 78 6d 6c 20 76 65 72 73 69 6f 6e 3d 22 31 |<?xml version="1|
00000010 2e 30 22 3f 3e 0a 3c 70 65 72 73 6f 6e 3e 0a 20 |.0"?>.<person>. |
00000020 20 3c 6e 61 6d 65 3e 4a c3 bc 72 67 65 6e 20 4d | <name>J..rgen M|
00000030 c3 bc 6c 6c 65 72 2d 42 c3 bc c3 9f 6c 69 63 68 |..ller-B....lich|
00000040 3c 2f 6e 61 6d 65 3e 0a 20 20 3c 6e 69 63 6b 3e |</name>. <nick>|
00000050 4a c3 b6 72 74 3c 2f 6e 69 63 6b 3e 0a 20 20 3c |J..rt</nick>. <|
00000060 63 6f 6d 6d 65 6e 74 3e 4d c3 b6 67 6c 69 63 68 |comment>M..glich|
00000070 65 72 77 65 69 73 65 20 69 73 74 20 64 61 73 20 |erweise ist das |
00000080 67 72 6f c3 9f 65 20 c3 9f 20 64 6f 63 68 20 65 |gro..e .. doch e|
00000090 69 6e 20 e1 ba 9e 2e 20 50 72 c3 bc 66 65 6e 20 |in .... Pr..fen |
000000a0 53 69 65 20 64 61 73 20 62 69 74 74 65 20 6d c3 |Sie das bitte m.|
000000b0 b6 67 6c 69 63 68 73 74 20 72 61 73 63 68 2e 3c |.glichst rasch.<|
000000c0 2f 63 6f 6d 6d 65 6e 74 3e 0a 3c 2f 70 65 72 73 |/comment>.</pers|
000000d0 6f 6e 3e |on>|
000000d3

Das ist ein bisschen viel der Automatik und hat schon manchen Tester in den Wahnsinn getrieben, weil beim Client was anderes ankommt als der Server schickt. Deswegen habe ich schon Verständnis für jeden, der so etwas byte-orientiert abarbeitet. Man muss es halt nur konsequent tun.

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