Thread Wide character in Compress::Raw::Zlib::crc32 (16 answers)
Opened by John Doe at 2011-05-23 12:50

moritz
 2011-05-31 12:10
#149291 #149291
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
Guest John Doe
Ich bastele derzeit an einem kleinen Webparser, der bestimmte Dateien nach bestimmten Kriterien speichern soll - wenn sie noch nicht gespeichert wurden. Um letzteres zu prüfen, lasse ich die CRC32 berechnen und vergleiche sie mit den CRCs der vorher gespeicherten Seiten.

CRC berechne ich wie folgt ($content wird von WWW::Mechanize mit $mech->content() ausgespuckt):
Code: (dl )
1
2
use Compress::Raw::Zlib;
my $crc = sprintf( "%x", Compress::Raw::Zlib::crc32( $content ) );


$content ist dekodierter Text, die CRC ist aber nur fuer Bytes definiert. Also musst du von Text nach Bytes konvertieren. Dieser Vorgang heist bei Perl "encode".

Code (perl): (dl )
1
2
3
use Encode qw/encode_utf8/;
use Compress::Raw::Zlib;
my $crc = sprintf( "%x", Compress::Raw::Zlib::crc32( encode_utf8 $content ) );


Der Ansatz mit "use bytes;" ist schlecht, weil er nicht explizit rueberbringt, mit welcher Zeichenkodierung du arbeiten willst.

Ausserdem gilt er nur im lexikalischen Scope, die Funktion die du aufrufst ist aber in einem anderen Scope, daher hat 'use bytes;' in dem Fall keine Auswirkung (use bytes; bewirkt nur, dass Funktionen wie substr() Byte-Semantik annehmen, es encoded nicht automatisch jeden Textstring in einen Bytestring).

View full thread Wide character in Compress::Raw::Zlib::crc32