hi,
open my $test, ">:utf8", $file;
Da setzt Du für den Layer eine Kodierung. Alles was Du dann in den Handler schreibst (mit print), das muss dieser Kodierung entsprechen (utf-8).
Perl unterscheidet seit 5.6 zwischen kodierten Zeichenketten und Oktetten, also zwischen byte- und charactersemantic. Gelegentlich ist dabei von einem UTF-8-Flag die Rede, wenn es sich um utf-8-kodierte Zeichenketten handelt.
UTF-8-kodiert Zeichenketten != Oktetten
Web/CGI: Eingaben, die mit CGI.pm geparst werden, sind im Default keine UTF-8-kodierten Zeichenketten, sondern Oktetten.
Es gibt mehrere Möglichkeiten:
- dem CGI.pm mitteilen, dass die Eingaben als UTF-8-kodierte Zeichenketten geliefert werden (neuere CGI.pm, bitte bei CPAN nachschauen)
- die bytesemantic beibehalten und beim print in einen Handler (Datei) diesen auf :raw belassen
- Encode.pm benutzen um zwischen byte- und charactersemantic wechseln zu können (Encode.pm ist ab 5.8 verfügbar)
- Pragma use bytes; no bytes;
- Täusche ich mich, oder ist es tatsächlich nicht vorgesehen, via CGI-Modul für Formulare die übliche Option "accept-charset" zu setzen? In der manpage steht nichts dazu drin und der Versuch, es wie alle anderen Optionen zu setzen
Entscheidend ist die Angabe der Kodierung im Content-Type-HTTP-Header, mit welchem das Formular ausgeliefert wird.
use CGI qw(-utf8);
Liefert Dir die Eingaben als UTF-8-kodierte Zeichenketten. Wenn das mit print in einen Handler (Filehandler, STDOUT) gehen soll, muss das utf-8-Flag wieder entfernt werden, so dass die reinen Oktetten vorliegen. Oder der Handler/Layer wird entsprechend gesetzt ':utf8'.
Hotti