1 2 3 4 5 6 7
#!/usr/bin/perl use Encode qw( encode decode ); my $unicode_name_CURRENCY_SIGN = chr(0xa4); 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";
2011-07-19T16:43:10 mcfaqCode (perl): (dl )1 2 3#!/usr/bin/perl use Encode qw( encode decode ); my $unicode_name_CURRENCY_SIGN = chr(0xa4);
QuoteCode: (dl )1
2
3
4print "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";
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
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