Schrift
[thread]12527[/thread]

Fragen/Probleme zu UTF8 und GZip

Leser: 1


<< >> 6 Einträge, 1 Seite
burnersk
 2008-09-22 11:06
#114824 #114824
User since
2008-03-25
83 Artikel
BenutzerIn
[default_avatar]
Hallo zusammen,

zur Zeit bin ich mit den GZip Modulen im klinsch. Sobald ich ein CR ("\n") im zu kompremierenden Content habe verweigern die Browser die Anzeige mit einem "Kodierungsfehler".
Auch wenn ich mein Script in UTF8 baue (was es zum Schluss auch sein muss) verweigern die Browser aus genanten Fehler die Anzeige.

Habe es schon mit [ul][li]CPAN:Compress::Zlib[/li][/ul] versucht.

Meine Tests liefen meistens so ab:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!perl -wt
use strict;
use warnings;
use utf8;
use bytes;
use encoding 'utf8';
use Compress::Zlib;
my $content;
foreach ('aa'..'ZZ') { $content .= $_; }
$content = Compress::Zlib::memGzip($content);
my $clength = bytes::length($content);
print qq~Status: 200 OK
Content-Type: text/plain; charset=utf-8
Content-Length: $clength
Content-Encoding: gzip

$content~;
1;
burnersk
 2008-09-22 11:25
#114825 #114825
User since
2008-03-25
83 Artikel
BenutzerIn
[default_avatar]
burnersk+2008-09-22 09:06:41--
Sobald ich ein CR ("\n") im zu kompremierenden Content habe verweigern die Browser die Anzeige mit einem "Kodierungsfehler".
Auch wenn ich mein Script in UTF8 baue (was es zum Schluss auch sein muss) verweigern die Browser aus genanten Fehler die Anzeige.


Habe den Fehler gefunden
Code (perl): (dl )
use encoding 'utf8';
. Aber warum?!
moritz
 2008-09-22 13:55
#114829 #114829
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
Also von use encoding würde ich dringend abraten, das kommt mit sehr vielen Problemen.

use utf8 ist schon richtig, allerdings werden ab dann alle Konstanten als Textstrings angesehen, und Kompressionsalgorithmen können nur was mit Bytestrings anfangen.

Also könntest du folgendes Probieren:

Code (perl): (dl )
1
2
3
4
5
6
7
8
use strict;
use warnings;
use utf8;
use Encode qw(encode_utf8)
binmode STDOUT;
...

$content = Compress::Zlib::memGzip(encode_utf8 $content);


Zu der Unterscheidung von Text- und Bytestrings und dem ganzen Unicode-Zeugs von Perl habe ich einen Artikel geschrieben, der manches "komische" Verhalten von Perl erklären sollte.
moritz
 2008-09-22 14:22
#114830 #114830
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
Noch eine Kleinigkeit:

burnersk+2008-09-22 09:06:41--
Code (perl): (dl )
1
2
use utf8;
use bytes;


Wenn du sowieso 'bytes' benutzen willst, ist das vorherige Laden von 'utf8' ziemlich sinnlos. (Und wenn du nicht weisst, was die einzelnen Pragmas machen, dann benutze sie nicht).
burnersk
 2008-09-22 15:17
#114833 #114833
User since
2008-03-25
83 Artikel
BenutzerIn
[default_avatar]
moritz+2008-09-22 12:22:52--
Wenn du sowieso 'bytes' benutzen willst, ist das vorherige Laden von 'utf8' ziemlich sinnlos. (Und wenn du nicht weisst, was die einzelnen Pragmas machen, dann benutze sie nicht).


???

Wenn ich in meinem Quellcode UTF-8 Zeichen habe muss ich wohl use utf8 machen!
Und wenn ich einen anständigen Length ermitteln will für die Browser, dann use bytes...

Außerdem macht use encoding 'utf8' sämtliche Variablendeklaration in UTF8. Was use utf8 nicht macht.
moritz
 2008-09-22 16:48
#114837 #114837
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
burnersk+2008-09-22 13:17:33--
moritz+2008-09-22 12:22:52--
Wenn du sowieso 'bytes' benutzen willst, ist das vorherige Laden von 'utf8' ziemlich sinnlos. (Und wenn du nicht weisst, was die einzelnen Pragmas machen, dann benutze sie nicht).


???

Wenn ich in meinem Quellcode UTF-8 Zeichen habe muss ich wohl use utf8 machen!
Und wenn ich einen anständigen Length ermitteln will für die Browser, dann use bytes...


Nur, wenn du Literale automatisch als utf-8 dekodieren willst, oder Nicht-ASCII-Zeichen in Variablennamennverwenden willst.
Kein Mensch muss müssen.

Jedenfalls wird das use utf8 von dem darauffolgenden use bytes; wieder aufgehoben, was das ganze etwas sinnlos wirken lässt.
Ich würde davon ausgehen, dass ein Kompressionsmodul immer Bytestrings zurückliefert, damit braucht man auch kein bytes::length(), ein einfaches length() reicht in dem Fall.

Quote
Außerdem macht use encoding 'utf8' sämtliche Variablendeklaration in UTF8. Was use utf8 nicht macht.


Natürlich nicht, wenn du es gleich danach mit use bytes wieder deaktivierst.

Update: Zur Illustration:

Code: (dl )
1
2
3
4
5
6
$ perl5.10.0 -wE ' use utf8; use bytes; say length "äöü"'
6
$ perl5.10.0 -wE ' use utf8; say length "äöü"'
3
$ perl5.10.0 -wE ' say length "äöü"'
6
<< >> 6 Einträge, 1 Seite



View all threads created 2008-09-22 11:06.