Home Unternehmen             Portfolio             Trainingsshop    Kunden & Partner Aktuelles    Kontakt
Home  Pfeil  ORDIX News  Pfeil  4/2002
suche: 

ORDIX News Archiv

Das IT-Magazin der ORDIX AG mit Fachbeiträgen zu Datenbanken, Unix und Java/XML.

Perl 5.8: National - International - Universal

Mit der Version 5.8 hat sich Perl einen weiteren Schritt von der Skript- zur Programmiersprache entwickelt. Eine herausragende Neuigkeit ist die standardmäßige Unterstützung des Universal Character Sets (UCS) nach der Norm ISO 10646. Von nun an können die Schriftzeichen aller Sprachen durch Perl-Programme verarbeitet werden. Damit ist die Voraussetzung für einen weltweiten Einsatz von Perl-Programmen, beispielsweise im Internet-Bereich, geschaffen. Durch die Verbreitung des UTF-8-Formats wird aber auch der Local-Player immer öfter gezwungen, sich mit UCS zu beschäftigen.

Universal Character Set - Wozu?

Einem großen Teil der Entwickler wird die Verwendung eines anderen Zeichensatzes nicht einleuchten. Erfahrungsgemäß kann das Programm doch alle Zeichen bearbeiten?!? Der Grund für diese Zufriedenheit liegt darin, dass der 7-Bit ASCII-Zeichensatz um 1 Bit erweitert wurde. So entstand eine Vielzahl von Zeichensätzen, die nun auch Sonderzeichen wie beispielsweise die deutschen Umlaute beinhalten.

Weit verbreitet ist der ISO 8859-1-Zeichensatz, der auf den ersten Blick kaum einen Wunsch übrig lässt. So unterstützt er Afrikaans, Baskisch, Catalan, Dänisch, Holländisch, Englisch, Faerose, Finnisch, Französisch, Portugiesisch, Galicisch, Deutsch, Isländisch, Norwegisch, Irisch, Italienisch, Schottisch, Spanisch und Schwedisch.

Auf den zweiten Blick ist zu erkennen, dass da schon Lücken sind, wie Türkisch, Griechisch, Russisch... Diese Lücken werden durch konkurrierende Zeichensätze der ISO 8859-Familie geschlossen. Der Entwickler kann sich aber nur für ein Mitglied der Familie entscheiden: Entweder Französisch oder Griechisch, Russisch oder Hebräisch ...

Die Lösung dieses Problems liegt in der Verwendung des Universal Character Set (UCS). Dieser vereinigt alle Schriftzeichen in einem System.

Im Wesentlichen besteht der UCS genauso wie der ASCII-Zeichensatz, aus einer Zuordnung von Zeichen zu Zahlen, hier Code-Points genannt. Code-Points werden oftmals im Format U-<Hex-Zahl> dargestellt, z. B. U-03B1.

Die ersten 128 Zeichen des UCS entsprechen der ASCII-Tabelle, die folgenden 128 Zeichen entsprechen dem ISO 8859-1-Zeichensatz. Der numerische Wert der Code-Points der ersten 256 Zeichen ist demnach identisch mit der ISO 8859-1-Tabelle.

Da es definiertes Ziel des UCS ist, alle möglichen Zeichen aufzunehmen, können Code-Points sehr große Werte annehmen. Derzeit sind Code-Points bis 231 vorgesehen.

Anstatt jedes Zeichen durch eine 31-Bit-Zahl darzustellen, wird UCS codiert, denn die Umstellung auf 31-Bit-Zeichen wäre revolutionär: Dokumente im ASCII- oder ISO 8859-Zeichensatz könnten nicht mehr verwendet werden.

Weit verbreitet ist die Codierung mit UTF-8: Mit diesem Format können einerseits reine ASCII-Texte unverändert eingelesen werden. Andererseits werden die Zeichen durch unterschiedlich viele Bytes dargestellt. Es werden nur so viele Bytes für ein Zeichen verwendet, wie erforderlich.

Die Anzahl der Bytes, die ein Zeichen darstellen, wird durch auf 1 gestellte Bits am Anfang des Bitmusters dargestellt, jedes zugehörige Byte fängt mit der Bitsequenz 10 an, um eine Verwechslung mit ASCII-Zeichen und dem ersten Byte eines Zeichens auszuschließen (siehe Abb. 1: Kodierung von UCS im UTF-8-Format.).

Auch wenn nur die durch ‘x’ markierten Bits für den Code-Point verwendet werden können, ist dies im Normalfall keine Verschwendung von Bytes: Mit den ersten 3 Bytes, also 16 Datenbits, sind die meistgebrauchten Zeichen darstellbar.

Perl und UTF-8

Perl verarbeitet einen String jetzt automatisch als Zeichenkette und nicht als Byte-Kette. Zeichen werden durch ihre numerische Repräsentation verwaltet.

So können UCS-Zeichen sowohl in Regulären Ausdrücken vorkommen als auch Gegenstand der Zeichenfunktionen pack, chr, substr, length und ord sein.

UCS-Zeichen können in Zeichenketten mit Hilfe des Code-Points im Format \x{<Code-Point>} dargestellt werden (vgl. Beispiel in Abb. 2: Beispiel für die Verarbeitung von UTF-8-Zeichen.).

Bei der Ein- und Ausgabe von Daten stellt sich fortan die Frage, in welchem Format die Daten vorliegen. Für die interne Verwaltung werden Zeichen erst dann im UTF-8-Format dargestellt, wenn sie nicht mehr als 8-Bit-Zeichen dargestellt werden können. Auf diese Weise wird die Kompatibilität zum früheren Verhalten gewahrt.

Um eine UTF-8-Datei zu erzeugen, muss ein entsprechender Filter verwendet werden (siehe Abb. 3: Beispiel für die Verwendung eines Filters.).

Im Beispiel-Skript utf2.pl ist zu sehen, dass die Umlaute in der Datei ausgabe.dat als 8-Bit-Zeichen abgespeichert werden, während in der Datei ausgabe.utf sechs zusätzliche Bytes für die UTF-8-Codierung erforderlich sind.

Unterstützt wird der Umgang mit den unterschiedlichen Dateiarten durch Filter, die vom PerlIO-Modul zur Verfügung gestellt werden. PerlIO wird ab Version 5.8 als Standardmodul für Ein- und Ausgaben verwendet. Wird die Funktion open mit drei Argumenten aufgerufen, so wird das zweite Argument als Filter interpretiert.

Reguläre Ausdrücke und UCS

Die Verarbeitung von UCS-Zeichenketten ist trotz aller Perl-Unterstützung etwas aufwendiger als bisher. Der Entwickler hat oftmals keine Vorstellung von den Strings, die in seinem Programm verarbeitet werden sollen. Allgemeine Eigenschaften einzelner Zeichen kann er mit Perl-Hilfsmitteln herausfinden. Dazu gibt es unterschiedliche Syntaxmöglichkeiten.

Am sinnvollsten erscheint die Verwendung der Unicode-Eigenschaften. Diese werden auch in anderen Programmiersprachen verwendet.

Die Eigenschaften jedes Zeichens sind in der Universal Character Database UCD festgehalten. Diese Eigenschaften können in Regulären Ausdrücken mit \p{<Unicode Propertie>} abgefragt werden. Der Einsatz dieser Unicode-Eigenschaften ist im Skript utf3.pl zu sehen.

Hier werden die eingegebenen Zeichen daraufhin geprüft, ob es sich um Buchstaben (B), Großbuchstaben (G), Ziffern (Z) oder Leerzeichen (L) handelt. Steuerzeichen werden als Ctrl ausgegeben. Neben der Angabe der Unicode-Properties wurden auch die konventionellen Zeichenklassen erweitert.

Allerdings ist Vorsicht geboten: In der Version 5.8.0 werden einige Unicode-Properties in Regulären Ausdrücken nicht unterstützt: die Angabe von IsDigit sowie IsSpace wurde schlichtweg ignoriert (siehe Abb. 4: Beispiel für die Verarbeitung von UCS in Regulären Ausdrücken.).

Dr. Stefan Koch (info@ordix.de).

Literaturhinweise