Thread length() liefert keinen utf-8-Wert (7 answers)
Opened by t-rex at 2006-08-25 10:27

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-->

View full thread length() liefert keinen utf-8-Wert