Siechfred: Encoding des Perl-Codes

Beitrag lesen

Danke für eure Antworten. Ich hab eben bemerkt, dass ich eine Ungenauigkeit in meinem vorherigen Posting hatte, deshalb kam wohl nicht die eigentliche Frage an.

Doch, ich denke schon.

Also nochmal: Ich möchte Perl mitteilen, in welchem Encoding meine Literale, bzw. meine hart kodierten Strings, innerhalb des Quelltextes vorliegen.

Nein, diese Info benötigt Perl selber nicht, siehe Perl's Unicode Model.

Ich möchte die Kodierung ja nicht mit Perl ermitteln, sondern ich _kenne_ die Kodierung und diese Kodierung möchte ich am besten fest in der Datei stehen haben, sodass sie nicht verloren gehen kann.

Sie geht nicht verloren. Wenn es Dir hilft, schreib am Anfang des Scriptes einen Kommentar als Meta-Information.

Sei da nun ein Programmierer, der seinen Code in iso-8859-15 schreibt und dann auch mal das Euro-Zeichen in einem Literal verwendet. Dann gibt er sein Skript einem anderen Programmierer und der denkt es ist iso-8859-1.

Das ist zunächst irrelevant. Es gibt einen einzigen Fall, den ich mir gerade vorstellen kann:

use utf8;  
my $€ = 'Euro';

Andersrum:

my $Euro = '€';

brauchst Du Perl nirgendwo mitzuteilen, dass es für die Verarbeitung des Strings bitteschön ISO-8859-15 verwenden soll. Erst wenn Du den String *ausgeben* willst, solltest Du explizit festlegen, in welcher Codierung er vorliegt:

use open OUT => ':encoding(iso-8859-15)';  
print $Euro;

Dann kommt eben an mancher Stelle kein Euro-Zeichen an.

Siehste, auf das "Ankommen" kommt's an ;)

Perl verwendet bei Ausgaben automatisch die interne Codierung (Link dazu s.o.). Liegen die auszugebenden Daten aber in einer anderen Codierung vor, muss man den Kanal, den man benutzen will (STDIN, STDOUT) auf diese Codierung "einstellen".

Oder genauer: Falls die Ausgabe z.B. nach UTF-8 konvertiert wird, muss Perl doch wissen, dass in diesem Skript iso-15 gemeint ist, und deshalb das Byte \xA4 (Euro-Zeichen) in einen anderen Codepoint konvertiert werden muss, als wenn iso-1 verwendet würde.

Wie gesagt, intern läuft das automagisch, extern musst Du es explizit angeben, wenn es von der nativen Codierung des Scriptes abweicht.

Das open-Pragma war mir bisher unbekannt, ich habe immer binmode() verwendet, um ein Encoding für einen Stream festzulegen. Das hat auch immer funktioniert. Ich sehe auch noch keine Vor- oder Nachteile, sondern nur eine weitere Möglichkeit, das zu bewerkstelligen. Kannst du da vielleicht noch was zu sagen? Danke.

Ich finde es halt besser zu handeln.

Siechfred

--
Obacht, hinter jedem noch so kleinen Busch könnte ein Indianer sitzen!