Schrift
[thread]803[/thread]

length() liefert keinen utf-8-Wert



<< >> 8 Einträge, 1 Seite
t-rex
 2006-08-25 10:27
#8594 #8594
User since
2004-06-30
5 Artikel
BenutzerIn
[default_avatar]
Überall lese ich, dass Perl spätestens seit 5.8 Zeichenketten als Zeichen und nicht byteweise interpretiert. Warum erhalte ich dann aber auf einem rundum utf8-konfiguriertem System (SuSE 10.0) für folgendes Skript

Code: (dl )
1
2
3
4
#!/usr/bin/perl -w
use strict;
my $s = "Ä";
print length($s)."\n";


die Ausgabe: "2" ?

Mein Problem ist ganz herkömmlicher Natur. Ich möchte Daten aus einem HTML-Fomular auf deren Validität prüfen. Für Umlaute liefert length() aber 2 Zeichen.
Wäre nett, wenn mir jemand diesen Bug aus meinem Kopf verscheuchen könnte.

Danke
t-rex.

/Modedit: Bitte auch Code-Tags für Code verwenden\n\n

<!--EDIT|GwenDragon|1156496940-->
vayu
 2006-08-25 12:28
#8595 #8595
User since
2005-01-13
782 Artikel
BenutzerIn
[default_avatar]
bei mir wird ne 1 ausgegeben unter Linux :(
nepos
 2006-08-25 12:37
#8596 #8596
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hm, ist dein Ä als UT8-Zeichen eingegeben worden? Wenn ja, solltest du eventuell mal ein
Code: (dl )
use utf8;
mit einbauen. Mehr Infos dazu dann unter utf8.
Eventuell auch noch hilfreich koennte perlunicode sein.\n\n

<!--EDIT|nepos|1156495084-->
docsnyder
 2006-09-18 15:41
#8597 #8597
User since
2005-09-08
300 Artikel
BenutzerIn
[Homepage] [default_avatar]
Bei mir kommt auch 1 raus.

Aber das "Ä" besteht bei mir auch physikalisch aus nur einem Byte. "od -t ax ..." liefert mir folgendes:

Code: (dl )
1
2
3
4
5
0000000   #   !   /   b   i   n   /   p   e   r   l  lf  lf   m   y  sp
23212f62 696e2f70 65726c0a 0a6d7920
0000020 $ s sp = sp " D " ; lf p r i n t sp
2473203d 2022c422 3b0a7072 696e7420
...


=> c4 (hex) = 196 (dec) = Ä

Gruß, Doc\n\n

<!--EDIT|docsnyder|1158579923-->
nepos
 2006-09-18 16:25
#8598 #8598
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hm, dann ist das Ä aber nicht als UTF8 kodiert oder?
docsnyder
 2006-09-18 17:02
#8599 #8599
User since
2005-09-08
300 Artikel
BenutzerIn
[Homepage] [default_avatar]
Kann ich Dir nicht sagen. Es sind wohl 8 Bits, aber ob das UTF8 ist (=Unicode)?

Habe das "Ä" mit Cut&Paste aus dem Originalbeitrag in mein Script eingebaut. Ich weiss nicht, wie das da reinkam bzw. wie es dort codiert wurde.

Gruß, Doc
esskar
 2006-09-18 17:21
#8600 #8600
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
Code: (dl )
use utf8;
ist nie die lösung

Code: (dl )
1
2
3
4
5
6
7
8
use CGI;
use Encode;

my $q = CGI->new;
my $s = decode("utf-8", $q->param("s") || '');

print "Content-Type: text/plain\n\n";
print "length of s: ", length($s), "\n";
heihon
 2006-09-18 21:44
#8601 #8601
User since
2006-09-15
15 Artikel
BenutzerIn
[default_avatar]
@doc: Wenn es 8 Bit sind, ist es mit Sicherheit kein UTF-8. In UTF-8 sind (vereinfacht) alle 7-Bit-ASCII Zeichen bis 0x7f mit einem Byte kodiert, alle anderen Zeichen (also auch alle Umlaute usw.) werden mit mindestens zwei Byte kodiert.

Ich brauchte mal eine Übersetzungstabelle Windows<->UTF8, und dabei kam etwa folgendes heraus (ergänzt um die Längenangaben in UTF8):
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
#!/usr/local/bin/perl 
use Encode qw(decode _utf8_off);

open(my $fh_8bit, ">", "utf8.txt") or die "open utf8.txt: $^E";
open(my $fh_utf8, ">", "utf8.utf") or die "open utf8.utf: $^E";
# byte order mark für UTF-8
print $fh_utf8 "\xef\xbb\xbf";

for my $num (128 .. 255) {
my $chr_8bit = chr($num);

# von 8-Bit Zeichensatz (z.B. Windows CP1252) nach UTF-8 übersetzen
my $chr_utf8 = decode("cp1252", $chr_8bit);

# wir wollen die raw octets auslesen
my $utf_octets = $chr_utf8;
_utf8_off($utf_octets);

my $raw_hex = "";
for my $byte (split(//, $utf_octets)) {
$raw_hex .= sprintf("%02x", ord($byte));
}
printf $fh_8bit ("Zeichen \\x%02x (%s) = UTF-8 \\x%s\n", $num, $chr_8bit, $raw_hex);
printf $fh_utf8 ("UTF-8 \\x%-6s = Zeichen (%s) Octets %d Chars %d\n",
$raw_hex, $utf_octets, length($utf_octets), length($chr_utf8));
}

Nun kann man sich utf8.txt und utf8.utf in einem UTF8-fähigen Editor (unter Windows z.B. SciTE oder PSPad - kephra kann das (noch) nicht) anschauen und z.B. mit der Ansicht im Hex-Editor vergleichen.\n\n

<!--EDIT|heihon|1158613432-->
<< >> 8 Einträge, 1 Seite



View all threads created 2006-08-25 10:27.