printf vs utf8

30/07/2008 - 21:42 von eixman | Report spam
#!/usr/bin/env perl

use strict;
use warnings;

# Lösung zu Übung 5.2 aus dem Lama-Buch

print "Geben Sie eine Reihe von Zeilen ein, die rechtsbündig formatiert werden sollen";

chomp( my @zeilen = <STDIN> );

my $ruler = "1234567890" x 6 . "";
print $ruler;

my $format = "%20s" x @zeilen;
printf $format, @zeilen;

# Problem:
# <<eingabe
# hallo
# tschüss
# hàßlich
# eingabe
#
# macht bei UTF8 eine „Treppe“. Warum?

# % perl --version
# This is perl, v5.8.8 built for i486-linux-gnu-thread-multi
# % echo $LANG
# de_DE.UTF-8
 

Lesen sie die antworten

#1 Moritz Lenz
30/07/2008 - 22:01 | Warnen spam
Florian Rehnisch wrote:
#!/usr/bin/env perl

use strict;
use warnings;

# Lösung zu Übung 5.2 aus dem Lama-Buch

print "Geben Sie eine Reihe von Zeilen ein, die rechtsbündig formatiert werden sollen";

chomp( my @zeilen = <STDIN> );

my $ruler = "1234567890" x 6 . "";
print $ruler;

my $format = "%20s" x @zeilen;
printf $format, @zeilen;

# Problem:
# <<eingabe
# hallo
# tschüss
# hàßlich
# eingabe
#
# macht bei UTF8 eine „Treppe“. Warum?



Weil du Perl nie gesgt hast, dass die Daten in UTF-8 sind. Perl nimmt
an, dass sie in Latin-1 sind (und jeder UTF-8 String ist auch ein
gültiger Latin-1-String).

Probier mal ein
binmode STDIN, ':encoding(UTF-8)';
binmode STDOUT, ':encoding(UTF-8)';
vor allen ein- und Ausgaben. Wenn du im Script selbst UTF-8-Zeichen als
Literale benutzt, brauchst du ausserdem noch ein
use utf8;

Siehe auch http://perlgeek.de/de/artikel/charsets-unicode

# % echo $LANG
# de_DE.UTF-8



ohne 'use locale;' ignoriert perl die locales weitestgehend. (use
locale; empfehle ich in dem Fall aber nicht)

HTH,
Moritz

Moritz Lenz
http://perl-6.de/ http://moritz.faui2k3.org/

Ähnliche fragen