#!/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