Thread use utf8 und Verhalten von String-Operationen
(65 answers)
Opened by rosti at 2011-08-03 19:16 2011-08-10T16:10:00 bianca 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) |