hotti: CGI-Modul & UTF-8

Beitrag lesen

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;
  1. 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'.

CGI.pm

Hotti