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

moritz
 2011-08-03 14:46
#151076 #151076
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
2011-08-03T10:19:05 rosti
Quote
Das Verhalten von substr() wird vom pragma utf8 bestimmt.


Ist nicht falsch, mit dem Zusatz, dass Pragma utf8 das Verhalten aller Stringfunktionen bestimmt, sofern diese auf Strings zugreifen, die INTERN im Script selbst notiert sind und das Script mit Zeichenkodierung 'utf-8' gespeichert wurde.


Das utf8 pragma hat nur Einfluss auf String-Literale.
Andererseits funktionieren die string-builtins unabhaengig davon, ob die Strings von Literalen stammen oder nicht

Quote
Teste es doch einfach mal selbst.


Aber sicher:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
use strict;
use warnings;
use Encode qw/encode_utf8/;
use charnames qw/:full/;
use 5.010; # nur fuer say() benoetigt

my $chars = "\N{LATIN SMALL LETTER A WITH DIAERESIS}\N{LATIN SMALL LETTER O WITH DIAERESIS}";
my $bytes = encode_utf8 $chars;

{
use utf8;
say 'With utf8';
say encode_utf8(uc($chars)), " ", uc($bytes);
say encode_utf8(substr($chars, 0, 2)), " ", substr($bytes, 0, 2);
}

{
no utf8;
say 'Without utf8';
say encode_utf8(uc($chars)), " ", uc($bytes);
say encode_utf8(substr($chars, 0, 2)), " ", substr($bytes, 0, 2);
}
__END__
With utf8
ÄÖ äö
äö ä
Without utf8
ÄÖ äö
äö ä


Du siehst, das utf8-Pragma hat keinerlei Einfluss auf das Ergebnis des String-Operationen. Wenn man substr() und uc() bytes liefert, arbeiten sie auf bytes, wenn man ihnen codepoints liefert, arbeiten sie auf codepoints, voellig unabaehngig vom utf8-Pragma.

Ueberzeugt?


Quote
Btw., in meiner Perl-Version (5.6.1. und 5.8.8) verlangt uc() das Pragma utf8, auch bei Strings, die von außerhalb (DB, CGI) in das Script hineinkommen


Viel zu kompliziert, bau doch einfach Beispiele, die von Kommandozeile aus funktionieren, sodass man nicht dein gesamte setup duplizieren muss.

Hier ist mein test:

Code: (dl )
1
2
$ echo -e "\xC3\xB5" | perl -wE 'binmode STDIN, ":utf8"; $_ = <>; chomp; say length'
1


Die Bytes C3B5 stehen in UTF-8 fuer ein õ, und length() liefert mir hier die Laenge 1 dafuer, d.h. der String wird als Kette von Codepoints interpretieriert, obwohl ich kein utf8-Pragma geladen habe.

Ueberzeugt?

View full thread use utf8 und Verhalten von String-Operationen