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

moritz
 2011-07-19 19:49
#150577 #150577
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
Also, Schritt für Schritt:

2011-07-19T16:43:10 mcfaq
Code (perl): (dl )
1
2
3
#!/usr/bin/perl
use Encode qw( encode decode );
my $unicode_name_CURRENCY_SIGN = chr(0xa4);


Du erzeugst also ein U+00A4 CURRENCY SIGN (¤)

Quote
Code: (dl )
1
2
3
4
print "In iso-8859-1: <", encode('iso-8859-1',$unicode_name_CURRENCY_SIGN),">\n";
print "In iso-8859-15: <", encode('iso-8859-15',$unicode_name_CURRENCY_SIGN),">\n";
print "In windows-1252: <", encode('cp1252',$unicode_name_CURRENCY_SIGN),">\n";
print "In utf-8: <", encode('utf-8-strict',$unicode_name_CURRENCY_SIGN),">\n";


Und erzeugst daraus Bytes.

Du musst also nachschauen, was die verschiedenen Zeichenkodierungen aus dem U+00A4 CURRENCY SIGN (¤) machen. Hast du aber in dem Ausschnitt aus der Wikipediatabelle nicht, sondern da hast du geschaut, wobei der Byte-Wert 0xA4 raus kommt.

Schaun wir mal, was dabei heraus kommt:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/usr/bin/perl
use strict;
use warnings;
use Encode qw( encode decode );
my $unicode_name_CURRENCY_SIGN = chr(0xa4);

sub _hex {
my $str = shift;
join '', map sprintf('%02X', ord($_)), split //, $str;

}

for (qw(ISO-8859-1 ISO-8859-15 windows-1252 UTF-8)) {
printf "%s %s\n", $_, _hex(encode($_, $unicode_name_CURRENCY_SIGN));
}
__END__
ISO-8859-1 A4
ISO-8859-15 3F
windows-1252 A4
UTF-8 C2A4


Diese Bytes bzw. Bytefolge bei UTF-8 "sieht" also dein Terminal.
Da ISO-8859-15 das CURRENCY SYMBOL nicht übersetzen kann (es kann nur das EURO SIGN übersetzen), wird bei ISO-8859-15 ein Fragezeichen (3F) draus.

Wenn das Terminal auf ISO-8859-15 eingestellt ist, wird das Byte A4 als Euro-Zeichen interpretiert, das 3F ist weiterhin ein Fragezeichen.

Ich hoffe, das erklärt für dich das Verhalten, das du siehst. Wenn nicht, schreib einfach, was dir noch unklar ist.

Editiert von moritz: fix markup

Editiert von moritz: fix markup, jetzt aber wirklich
Last edited: 2011-07-19 19:51:32 +0200 (CEST)

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