Thread Ungewöhnliches Verhalten von chr() und encode / decode (4 answers)
Opened by mcfaq at 2011-07-19 18:43

mcfaq
 2011-07-20 14:38
#150605 #150605
User since
2011-04-20
20 Artikel
BenutzerIn
[default_avatar]
Hallo nochmal.

Ich möchte noch zum Abschluss dieses Threads folgenden Perl Code zum Verständnis des Unterschieds zwischen Binären- und Character-Strings und der Erstellung von Octets hinterlegen:

Code (perl): (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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#!/usr/bin/perl
use Encode qw( from_to is_utf8 encode decode );

#Skalare Variable vom Typ String.
#Character-String, weil Zeichen in interner Perl Codierung für Zeichen gespeichert sind.
$euro_char_generated_from_unicode_code_point = chr(0x20AC);

#ergibt: is_utf8: ja
if( is_utf8($euro_char_generated_from_unicode_code_point) ){
  print "\$euro_char_generated_from_unicode_code_point is_utf8: ja \n";  
}
else{
  print "\$euro_char_generated_from_unicode_code_point is_utf8: nein \n";  
}

#ergibt: 8364 == 0x20AC
print 'ord($euro_char_generated_from_unicode_code_point): ',ord($euro_char_generated_from_unicode_code_point), "\n";


#Skalare Variable vom Typ String:
#Byte-String, weil encodierte Zeichen ungleich der internen perl Codierung
#für Strings (Latin 1 (='iso-8859-15') oder Utf-8) sind
$octets_of_euro_in_latin9 = encode('iso-8859-15',chr(0x20AC));

#ergibt: is_utf8: nein
if( is_utf8($octets_of_euro_in_latin9) ){
  print "\$octets_of_euro_in_latin9 is_utf8: ja \n";  
}
else{
  print "\$octets_of_euro_in_latin9 is_utf8: nein \n";  
}

#Skalare Variable vom Typ Zahl. Wert ist 0xA4. Nicht 0x20AC!
$octets_of_euro_in_latin9_zahlenwert = ord($octets_of_euro_in_latin9);

#Skalare Variable vom Typ Zahl. Wert is 0xA6.
#Codepoint für "BROKEN BAR" (|) Zeichen in Unicode und
#LATIN CAPITAL LETTER S WITH CARON in Latin-9 (=iso-8859-15)
$octets_of_LATIN_CAPITAL_LETTER_S_WITH_CARON_zahlenwert = $octets_of_euro_in_latin9_zahlenwert + 2;

#Skalare Variable vom Typ String:
#Byte-String, trotz der Tatsache, dass wir chr() ohne zusätzliche Anwendung der encode Funktion benutzt haben.
#Perl hat sich gemerkt, dass das Argument für chr aus dem Ergebnis der Berechnung mit einem Nicht-Unicode Zeichen stammt.
$octets_of_LATIN_CAPITAL_LETTER_S_WITH_CARON = chr($octets_of_LATIN_CAPITAL_LETTER_S_WITH_CARON_zahlenwert);

#ergibt: is_utf8: nein
if( is_utf8($octets_of_LATIN_CAPITAL_LETTER_S_WITH_CARON) ){
  print "\$octets_of_LATIN_CAPITAL_LETTER_S_WITH_CARON is_utf8: ja \n";  
}
else{
  print "\$octets_of_LATIN_CAPITAL_LETTER_S_WITH_CARON is_utf8: nein \n";  
}

################## Gegenbeispiel Anfang ############

print "\n\nGegensbeispiel fuer chr() mit direktem Zahlenwert ohne Einwirkung des Zahlenwertes einer encodierten Variablen.\n";
#chr() mit Variable initialisiert mit direktem Zahlenwert 0xA6.
$eineZahl = 0xA6;

#Skalare Variable vom Typ String.
#Character-String: BROKEN_BAR Zeichen in Unicode Tabelle
$char_of_BROKEN_BAR = chr($eineZahl);

#ergibt: is_utf8: ja
if( is_utf8($char_of_BROKEN_BAR) ){
  print "\$char_of_BROKEN_BAR is_utf8: ja \n";  
}
else{
  print "\$char_of_BROKEN_BAR is_utf8: nein \n";  
}

print "Gegensbeispiel Ende.\n\n\n";
################## Gegenbeispiel ENDE ############


#Skalare Variable vom Typ String:
#Byte-String, da von einer Codierung auf eine andere Codierung gewechselt wurde. Trotz der Tatsache, das Perl
#intern ebenfalls Char-Strings bei Bedarf in UTF-8 speichert.
from_to($octets_of_LATIN_CAPITAL_LETTER_S_WITH_CARON, "iso-8859-15", "utf-8");

#ergibt das Zeichen LATIN_CAPITAL_LETTER_S_WITH_CARON in einem Terminal, das auf UTF-8 eingestellt ist.
print "\$octets_of_LATIN_CAPITAL_LETTER_S_WITH_CARON: $octets_of_LATIN_CAPITAL_LETTER_S_WITH_CARON\n";

#ergibt: is_utf8: nein
if( is_utf8($octets_of_LATIN_CAPITAL_LETTER_S_WITH_CARON) ){
  print "\$octets_of_LATIN_CAPITAL_LETTER_S_WITH_CARON is_utf8: ja \n";  
}
else{
  print "\$octets_of_LATIN_CAPITAL_LETTER_S_WITH_CARON is_utf8: nein \n";  
}

#ergibt:197 == 0xC5. <-- Warum dieses Ergebnis? Es ist das erste Byte der Octets in
#$octets_of_LATIN_CAPITAL_LETTER_S_WITH_CARON nach from_to() Aufruf.
#Dieses Oktet is der UTF-8 kodierte Codepoint in der Unicode-Tabelle für
#LATIN_CAPITAL_LETTER_S_WITH_CARON = 0x160.
#Die UTF-8 Kodierung der Zahl 0x160 ist: 0xC5A0. Davon das erste Byte = 0xC5 
print 'ord($octets_of_LATIN_CAPITAL_LETTER_S_WITH_CARON): ',ord($octets_of_LATIN_CAPITAL_LETTER_S_WITH_CARON),"\n";

__END__
$euro_char_generated_from_unicode_code_point is_utf8: ja
ord($euro_char_generated_from_unicode_code_point): 8364
$octets_of_euro_in_latin9 is_utf8: nein
$octets_of_LATIN_CAPITAL_LETTER_S_WITH_CARON is_utf8: nein


Gegensbeispiel fuer chr() mit direktem Zahlenwert ohne Einwirkung des Zahlenwertes einer encodierten Variablen.
$char_of_BROKEN_BAR is_utf8: nein
Gegensbeispiel Ende.


$octets_of_LATIN_CAPITAL_LETTER_S_WITH_CARON: Š
$octets_of_LATIN_CAPITAL_LETTER_S_WITH_CARON is_utf8: nein
ord($octets_of_LATIN_CAPITAL_LETTER_S_WITH_CARON): 197


Gruß und Danke.

mcfaq.

View full thread Ungewöhnliches Verhalten von chr() und encode / decode