1 2 3 4 5 6
#!/usr/bin/perl use strict; use warnings; use utf8; binmode(STDOUT,':utf8'); print "Blahhhh, blah', blaaaÄÖÜäöüß!\n";
1 2
gunzip \$response->content => \$content_decoded; $response->{_content} = \$content_decoded;
_utf8_on(${$response->{_content}});
GwenDragonUnd man kann kein UTF-8-Flags setzen.
GwenDragonWozu Du _utf8_on brauchst, ist mir ein Rätsel. geht auch ohne wie mein Programm zeigte.
QuoteProbier als Layer für dein Filehandle mal ':utf8' anzugeben. Das Ergebnis wird herrlichste Mojibake sein.
2018-10-24T13:29:03 rostiLiest Du eigentlich was wir hier posten?
1 2 3 4 5 6
#!/usr/bin/perl use strict; use warnings; my $x = lc('ẞ'); print "$x\n";
1 2 3 4 5 6 7 8 9
#!/usr/bin/perl use strict; use warnings; use utf8; binmode(STDOUT,':utf8'); my $x = lc('ẞ'); print "$x\n";
2018-10-24T13:29:03 rostiHab ich doch geschrieben was passier: Genau das schaltet die interne Kodierung ab.
tchristCode that assumes it can open a text file without specifying the encoding is broken.
2018-10-24T13:29:03 rostiUnd selbstverständlich ist diese zwingend erforderlich wenn ein Code bytesemantisch arbeiten soll, was gzip, deflate usw. nämlich tun: Sie arbeiten mit Bytes und nicht mit Zeichen, bspw. ist die Anzahl der Bytes nicht gleich der Anzahl der Zeichen!
Your_nameAber `IO::Uncompress::Gunzip` verwendet "use bytes", cleared das Flag also wieder. Dann dekomprimiert gunzip meine Daten binär-orientiert, setzt aber das UTF-8-Flag nicht.
Your_namegunzip kann nicht erkennen (und mal so gesagt: woher denn auch? Ich rufe die Funktion ohne Encoding-Kontext auf)
1 2 3 4 5 6
#!/usr/bin/perl use strict; use warnings; my $x = lc('ẞ'); print "$x\n";
Guest Your_nameDen liefert Perl, spätestens seit Version 5.18, hinreichend unfallfrei.Tatsache ist, dass ich ordentlichen UTF-8-Support haben will.
Guest Your_nameDas gilt für jeden, auch für Dich. Aus Deinem Ausgangstext:Ich empfehle dir, dich mal in Unicode-Support in Perl einzulernen, denn es gilt: kann man alles lernen, muss man aber selber machen. Für dich machen kann ich nicht.
Guest Your_name"decoded_content" verwende ich nicht, weil die Funktion viel zu fett und lahmarschig ist, Header durchgeht, Speicherallokationen macht und Haste nicht gesehen.
Guest Your_nameLWP::UserAgent macht keinen Scheiß, sondern liefert wahlweise die unbehandelte Bytewurst in $res->content oder den nach Transfer-Encoding und gegebenenfalls Text-Encoding ausgepackten Wert in $res->decoded_content.1. Wie sage ich LWP::UserAgent, dass es den Scheiß lassen soll?
Guest Your_nameIO::Uncompress::Gunzip macht keinen Scheiß, sondern wandelt eine Bytewurst in eine andere Bytewurst um.2. Wie sage ich IO::Uncompress::Gunzip, dass es den Scheiß lassen soll?
Guest Your_nameDisclaimer: 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.
Tom Christiansen, erweiterte VersionCode that assumes it can open a text file or retrieve data over the web without specifying the encoding is broken.
https://perldoc.perl.org/perl5100delta.html#UTF-8-problemsThe handling of Unicode still is unclean in several places, where it's dependent on whether a string is internally flagged as UTF-8. This will be made more consistent in perl 5.12, but that won't be possible without a certain amount of backwards incompatibility
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
use strict; use warnings; use dbh; use IO::File; my $dbh = (bless{},'main')->dbh('myweb'); $dbh->do(q( CREATE TABLE if not exists images( id int(32) auto_increment primary key, image text )CHARSET=Latin1 )); #print $dbh->selectrow_array('SHOW CREATE TABLE images'); # eine Grafik einlesen my $fh = IO::File->new; $fh->open('768.jpg', O_BINARY|O_RDONLY) or die $!; read($fh, my $image, -s $fh); $fh->close; # Grafik in MySQL Textfeld einfügen $dbh->do("INSERT INTO images(image)values(?)", {}, $image); # Grafik aus MySQL auslesen my $binary = $dbh->selectrow_array('SELECT image FROM images WHERE id = (SELECT LAST_INSERT_ID())'); # Grafik zur Kontrolle ausgeben $fh->open('new.jpg', O_CREAT|O_TRUNC|O_BINARY|O_RDWR) or die $!; $fh->print($binary); $fh->close; $dbh->do('drop table images');
binmode(STDOUT,':utf8');
QuoteEr hält es ja auch geheim welches Perl er nutzt und welche Modul-Version.
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
#!/usr/bin/perl use strict; use warnings; use 5.010; use utf8; use LWP::UserAgent; use HTTP::Request; my $ua = LWP::UserAgent->new; $ua->agent("MyApp/0.1 "); $ua->default_header('Accept-Encoding' => 'gzip'); # Create a request my $req = HTTP::Request->new(GET => 'https://labs.gwendragon.de/test/data.xml'); # Pass request to the user agent and get a response back my $res = $ua->request($req); my ($content, $output); # Check the outcome of the response if ($res->is_success) { $content = $res->content; say $req->as_string; say $res->as_string; say '------------------------------'; } else { say $res->status_line; } say ""; say "===== Gunzpped ==============="; use IO::Uncompress::Gunzip qw(gunzip $GunzipError); my $status = gunzip(\$content => \$output) or die "gunzip failed: $GunzipError\n"; say $output; open my $FH, '>', 'get.data'; binmode $FH; say $FH $output;
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
PERL-5.14 T:\>chcp
Aktive Codepage: 65001.
PERL-5.14 T:\>perl get.pl
GET https://labs.gwendragon.de/test/data.xml
Accept-Encoding: gzip
User-Agent: MyApp/0.1 libwww-perl/6.04
HTTP/1.1 200 OK
Cache-Control: max-age=84501
Connection: Upgrade, close
Date: Tue, 23 Oct 2018 15:11:10 GMT
Upgrade: h2,h2c
Accept-Ranges: bytes
ETag: "e4-578e65676f100-gzip"
Server: Apache
Vary: Accept-Encoding,User-Agent
Content-Encoding: gzip
Content-Length: 200
Content-Type: application/xml
Expires: Wed, 24 Oct 2018 14:39:32 GMT
Last-Modified: Tue, 23 Oct 2018 14:39:32 GMT
Client-Date: Tue, 23 Oct 2018 15:11:10 GMT
Client-Peer: 213.133.110.246:443
Client-Response-Num: 1
Client-SSL-Cert-Issuer: /C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
Client-SSL-Cert-Subject: /CN=labs.gwendragon.de
Client-SSL-Cipher: ECDHE-RSA-AES256-GCM-SHA384
Client-SSL-Socket-Class: IO::Socket::SSL
Content-Security-Policy: script-src 'self'
Referrer-Policy: no-referrer
Strict-Transport-Security: max-age=15768000; includeSubDomains
X-Content-Type-Options: nosniff
X-Download-Options: noopen
X-Frame-Options: sameorigin
X-LoadTime: D=489 us
X-Powered-By: Perl
X-Robots-Tag: noarchive, noodp, noimageindex
X-XSS-Protection: 1; mode=block
5=@{N1X 0!1Qn-(ݞě^fcK
xUUnHy|>M\B"`XhZTP4֏;p0.LDģy"YBk| )~)H8srA._±-R"-Ɇ
------------------------------
===== Gunzpped ===============
<?xml version="1.0" encoding="UTF-8"?>
<person>
<name>Jürgen Müller-Büßlich</name>
<nick>Jört</nick>
<comment>Möglicherweise ist das große ß doch ein ẞ. Prüfen Sie das bitte möglichst rasch.</comment>
</person>
PERL-5.14 T:\>file get.data
get.data: XML 1.0 document, UTF-8 Unicode text, with CRLF line terminators
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
T:\>hd get.data
/0 /1 /2 /3 /4 /5 /6 /7 /8 /9/ A /B /C /D /E /F 0123456789ABCDEF
0000 : 3C 3F 78 6D 6C 20 76 65 72 73 69 6F 6E 3D 22 31 <?xml version="1
0010 : 2E 30 22 20 65 6E 63 6F 64 69 6E 67 3D 22 55 54 .0" encoding="UT
0020 : 46 2D 38 22 3F 3E 0D 0A 3C 70 65 72 73 6F 6E 3E F-8"?>..<person>
0030 : 0D 0A 20 20 3C 6E 61 6D 65 3E 4A C3 BC 72 67 65 .. <name>J..rge
0040 : 6E 20 4D C3 BC 6C 6C 65 72 2D 42 C3 BC C3 9F 6C n M..ller-B....l
0050 : 69 63 68 3C 2F 6E 61 6D 65 3E 0D 0A 20 20 3C 6E ich</name>.. <n
0060 : 69 63 6B 3E 4A C3 B6 72 74 3C 2F 6E 69 63 6B 3E ick>J..rt</nick>
0070 : 0D 0A 20 20 3C 63 6F 6D 6D 65 6E 74 3E 4D C3 B6 .. <comment>M..
0080 : 67 6C 69 63 68 65 72 77 65 69 73 65 20 69 73 74 glicherweise ist
0090 : 20 64 61 73 20 67 72 6F C3 9F 65 20 C3 9F 20 64 das gro..e .. d
00A0 : 6F 63 68 20 65 69 6E 20 E1 BA 9E 2E 20 50 72 C3 och ein .... Pr.
00B0 : BC 66 65 6E 20 53 69 65 20 64 61 73 20 62 69 74 .fen Sie das bit
00C0 : 74 65 20 6D C3 B6 67 6C 69 63 68 73 74 20 72 61 te m..glichst ra
00D0 : 73 63 68 2E 3C 2F 63 6F 6D 6D 65 6E 74 3E 0D 0A sch.</comment>..
00E0 : 3C 2F 70 65 72 73 6F 6E 3E 0D 0A </person>..
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
2018-10-23T14:25:02 GwenDragonBei all deinem Ärger: um welches Perl und um welche Modul-Versionen handelt es sich denn?
1 2 3 4 5
use strict; use warnings; use utf8; binmode(STDOUT,':utf8'); print "Blahhhh, blah', blaaaÄÖÜäöüß!\n";