Jedes Kommandozeilenprogramm, das Texte und Meldungen mit
Non-ASCII-Zeichen (z.B. Umlauten) aufs Terminal ausgibt, sollte die
aktuelle Locale-Einstellung berücksichtigen, damit sichergestellt ist,
dass alle Zeichen richtig dargestellt werden.
Es reicht nicht aus, dass die Ausgabe unter der eigenen
Terminal-Einstellung (z.B LANG=xx_XX.UTF-8) korrekt aussieht. Denn
hat der Anwender ein abweichendes Character-Encoding konfiguriert
(z.B. LANG=xx_XX.ISO-8859-1), sieht er anstelle der
Non-ASCII-Zeichen Zeichensalat, wenn das Programm nicht explizit in
dieses Encoding wandelt (in diesem Fall sähe er zwei Zeichen statt
einem für jeden Umlaut).
In Perl lässt sich diese nicht-triviale Aufgabe elegant durch
Verwendung des Pragma open
in Verbindung mit der Angabe ':locale' lösen. Die Zeile
am Anfang des Programms sorgt dafür, dass für alle Ausgabeströme
(einschl. STDOUT und STDERR) ein I/O-Layer eingerichtet wird, der die
geschriebenen Daten automatisch gemäß dem in der Umgebung
eingestellten Character-Encoding enkodiert.
Beispiel: Die folgenden beiden Programme geben für beliebig in der
Umgebung eingestellte Zeichensätze mit deutschen Umlauten -
u.a. UTF-8 und ISO-8859-1 - zwei Zeilen mit Umlauten aus, die
korrekt dargestellt sein sollten. Hierbei erzeugt print die Ausgabe
via STDOUT und warn die Ausgabe via STDERR.
Quelle mit einem Latin1-Editor erstellt:
#!/usr/bin/env perl
use strict;
use warnings;
use open OUT=>':locale';
my $str = "ÄÖÜäöüß";
print "$str\n";
warn "$str\n";
# eof .
Quelle mit einem UTF-8-Editor erstellt:
#!/usr/bin/env perl
use strict;
use warnings;
use utf8; # <- UTF-8 Quelltext
use open OUT=>':locale';
my $str = "ÄÖÜäöüß";
print "$str\n";
warn "$str\n";
# eof .
Links