Thread use utf8 und Verhalten von String-Operationen (65 answers)
Opened by rosti at 2011-08-03 19:16

rosti
 2011-08-10 18:29
#151493 #151493
User since
2011-03-19
3194 Artikel
BenutzerIn
[Homepage]
user image
2011-08-10T16:10:00 bianca
Aber noch eine Frage: Wenn ich ein Script in UTF8 speichere, wieso brauche ich dann noch use utf8? Ist das zur besseren Lesbarkeit und Klarheit oder hat das noch einen Zusatzeffekt?


Es hat mit der Lesbarkeit nichts zu tun, aber es hat einen Effekt ;)
Der Effekt ist darin begründet, dass es seit Perl v5.6 den internen Scalar-Value SvUTF8 gibt.

Du hast in deinem Script das 'ä' als Literal und length('ä') schnappt sich das 'ä' als internen Scalar-Value. Schaltest Du das Pragme utf8 vorher ein, wird das 'ä' als SvUTF8 Perl-intern repräsentiert. Anstelle der byte-Semantic gilt nunmehr die Character-Semantic und length('ä') gibt nicht die Anzahl der Bytes sondern die Anzahl der Zeichen aus.

Speicherst Du jedoch dein Script in ANSI o.ä. 8-bit-Kodier-Zeugs, wird es nach use utf8; in dem Moment eine Fehlermeldung geben, wenn das Literal 'ä' perl-intern als SvUTF8 abgelegt werden soll (Die FM, wie Du gesehen hast an Zeile 6).

Ohne Pragma utf8 gilt bei einem print 'ä' die Byte-Semantic, egal, ob das Script in utf-8 oder ANSI gespeichert ist. print 'ä' geht auf STDOUT und in diesem Handle werden auch Bytes erwartet. Geht ein print 'ä' in Richtung Webserver, geht es ebenfalls auf STDOUT und das Zeichen wird korrekt dargestellt. Auf STDOUT u.a. Handle gehören also Bytes.


PS/Edit, zum Testen speicher dein Script in utf-8 und notiere
Code (perl): (dl )
1
2
3
4
use utf8;
print "Content-Type: text/plain; charset=UTF-8\n\n"; # zum Webserver
binmode STDOUT, ':utf8';
print 'ä';


Lass es mal so über den Webserver laufen. Das 'ä' wird korrekt dargestellt. binmode STDOUT, ':utf8'; schaltet den IOLayer auf Byte-Semantics und alles wird gut.

Freilich geht es auch einfacher, nämlich so:
Code (perl): (dl )
1
2
print "Content-Type: text/plain; charset=UTF-8\n\n"; # zum Webserver
print 'ä';


unter der Voraussetzung, dass dein Script in utf-8 gespeichert ist.
Last edited: 2011-08-10 18:45:00 +0200 (CEST)

View full thread use utf8 und Verhalten von String-Operationen