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

pq
 2011-08-03 12:29
#151035 #151035
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
falsch.

warum willst du es immer wieder durchkauen?
use utf8 verändert, wie variablen kodiert sind.

substr entscheidet nur danach, wie variablen kodiert sind (abgesehen von use bytes).

beweis:
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
$ perl -wE'
use Devel::Peek;
use Encode;
use utf8;

my $str = "ä";
my $substr = substr($str, 0, 1);
Dump $substr;
$str = encode_utf8($str);
$substr = substr($str, 0, 1);
Dump $substr;
'
SV = PV(0xa0ff780) at 0xa11cab0
REFCNT = 1
FLAGS = (PADMY,POK,pPOK,UTF8)
PV = 0xa1209b8 "\303\244"\0 [UTF8 "\x{e4}"]
CUR = 2
LEN = 4
SV = PV(0xa0ff780) at 0xa11cab0
REFCNT = 1
FLAGS = (PADMY,POK,pPOK)
PV = 0xa1209b8 "\303"\0
CUR = 1
LEN = 4


was haben wir hier?
einen string ä, der unter use utf8 in die variable $str geschrieben wurde.
das erste substr arbeitet korrekt und sieht die 2 bytes als einen character.

dann:
$str = encode_utf8($str);
ich behandle nun $str und kodiere ihn, so dass \303\244 ohne utf8-flag drinstehen. die beiden werden nun von perl als 2 voneinander getrennte bytes angesehen.
in der folge liefert substr() auch nur die \303, was das ergebnis kaputt macht.

ergo: use utf8 hat substr() hier nicht dazu gebracht, zeichenweise zu arbeiten, weil substr() sich nur am string selbst orientiert. substr() ist es schnurzpiepegal, ob oben irgendwo use utf8 steht.

aber vermutlich begründest du das jetzt damit, dass unicode-unterstützung in perl ja noch in der entwicklung ist ;-)

leider sparst du immer gerne mit beweisen. mein beweis ist ein komplettes kommandozeilen skript mit ausgabe.


edit: und weils so schön war, hier noch der 2. gegenbeweis.

mein erstes beispiel zeigt, dass ich use utf8 verwende, den string danach aber kodiere und substr() byteweise arbeitet, obwohl oben use utf8 steht.

ich kehre das nun um und benutze use utf8, wende substr an und sage danach "no utf8";
laut deiner logik müsste "no utf8" plötzlich dafür sorgen, dass substr() byteweise arbeitet. tut es aber nicht:
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
$ perl -wE'
use Devel::Peek;
use utf8;
use Encode;
my $str = "ä";
my $substr = substr($str, 0, 1);
Dump $substr;

no utf8;

$substr = substr($str, 0, 1);
Dump $substr;
'
SV = PV(0x8af9780) at 0x8b16aa0
REFCNT = 1
FLAGS = (PADMY,POK,pPOK,UTF8)
PV = 0x8b1a9a8 "\303\244"\0 [UTF8 "\x{e4}"]
CUR = 2
LEN = 4
SV = PV(0x8af9780) at 0x8b16aa0
REFCNT = 1
FLAGS = (PADMY,POK,pPOK,UTF8)
PV = 0x8b1a9a8 "\303\244"\0 [UTF8 "\x{e4}"]
CUR = 2
LEN = 4

Last edited: 2011-08-03 12:36:44 +0200 (CEST)
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem

View full thread use utf8 und Verhalten von String-Operationen