Zeichensätze

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Anpassen des Anwendungscodes für andere Gebietsschemata


Seit Windows NT verwenden alle Windows-Versionen Unicode mit der UTF-16-Codierung. In Delphi werden alle in UTF-16 codierten Zeichen als Wide-Zeichen dargestellt.

Alte Versionen (Windows 95/98/Me) der westeuropäischen Windows-Editionen (einschließlich Englisch, Französisch und Deutsch) verwenden den Zeichensatz ANSI Latin-1. Andere Editionen dieser Windows-Versionen (vor Windows NT) verwenden hingegen andere Zeichensätze. Die japanische Version von Windows 95 arbeitet beispielsweise mit dem Zeichensatz Shift-JIS, in dem die japanischen Schriftzeichen als Multibyte-Zeichencodes dargestellt werden.

Im Allgemeinen gibt es drei Arten von Zeichensätzen:

Es wird dringend empfohlen, dass Sie Unicode in Ihren Anwendungen verwenden, aber viele Anwendungen oder Datendateien sind noch von alten Codeseiten abhängig.

Einzelbyte-Zeichen

In Einzelbyte-Zeichensätzen wird jedes Zeichen durch eine Einzelbyte-Zahl dargestellt. Einzelbyte-Zeichensätze verwenden Zeichencodierungsschemas, die jedes Zeichen einem numerischen Wert (oder Codepoint) zuordnen, der von einem Byte (8 Bit) dargestellt wird. Eine Codeseite ist eine spezielle Zuordnung (Codierungsschema) von Zeichen in einem Zeichensatz zu Codepoints.

In Delphi können Einzelbyte-Zeichen mit dem Typ AnsiChar dargestellt werden.

Einzelbyte-Zeichensätze (oder Codeseiten) wurden von alten Windows-Versionen (vor Windows NT) verwendet. Beispielsweise ist der Zeichensatz ANSI Latin-1 (Codeseite 1252) der Einzelbyte-Zeichensatz für die alten westeuropäischen Windows-Editionen. ANSI ist das Akronym für "American National Standards Institute".

Zeichen, die den Zahlen 32 bis 127 (niedrigwertige 7 Bit) zugeordnet sind, sind für alle Einzelbyte-Zeichensätze gleich und bilden den 7-Bit-Satz ASCII. ASCII ist das Akronym für "American Standard Code for Information Interchange".

Windows-Codeseiten, üblicherweise ANSI-Codeseiten genannt, sind Einzelbyte-Codeseiten, für die Nicht-ASCII-Werte internationale Zeichen darstellen. Zeichen des Nicht-ASCII-Bereichs (128 bis 255) werden erweiterte Zeichen genannt und variieren in den verschiedenen Codeseiten. Der Satz der erweiterten Zeichen bestimmt, welche Sprachen die Codeseite unterstützen kann. Diese ANSI-Codeseiten werden in alten Windows-Versionen verwendet und stehen weiterhin in Windows NT und höher zur Verfügung.

In Codeseiten von Originalgeräteherstellern (Original equipment manufacturer, OEM) repräsentieren Nicht-ASCII-Werte Interpunktionszeichen und Zeichen für Linien. Diese Codeseiten wurden ursprünglich für MS DOS verwendet und werden immer noch als Standardcodeseiten für Konsolenanwendungen eingesetzt. OEM-Codeseiten werden auch für nicht-erweiterte Dateinamen in den alten FAT12-, FAT16- und FAT32-Dateisystemen verwendet. Im Gegensatz dazu speichert das NTFS-Dateisystem Dateinamen in Unicode.

Ihre Anwendung kann mit den Standardfunktionen der Laufzeitbibliothek CharToOem und CharToOemBuf zwischen Windows- und OEM-Codeseiten eine Konvertierung durchführen. Bei diesen Funktionen ist jedoch ein Datenverlust nicht ausgeschlossen, weil die Zeichen, die durch passende Windows- und OEM-Codeseiten dargestellt werden können, nicht genau übereinstimmen.

In westeuropäischen Windows-Editionen ist die übliche OEM-Codeseite 437. Sie unterscheidet sich von der Codeseite 1252 (ANSI Latin-1). Bei anderen Gebietseinstellungen, einschließlich Windows für den Fernen Osten, stimmen die OEM-Codeseiten mit den ANSI-Codeseiten überein.

Multibyte-Zeichen

Bei den ideografischen Zeichensätzen Asiens ist eine einfache 1:1-Zuordnung zwischen den Zeichen der Sprache und dem 1 Byte großen Datentyp AnsiChar nicht möglich. Diese Sprachen enthalten mehr Zeichen, als mit den Einzelbyte-Zeichen dargestellt werden können.

Ein Ansatz der Arbeit mit ideografischen Zeichensätzen besteht in der Konvertierung aller Zeichen anhand eines Codierungsschemas in einen numerischen Wert (oder Codepoint), der größer als ein Byte ist. Solche Zeichen werden als Multibyte-Zeichen bezeichnet. Multibyte-Zeichensätze ermöglichen, dass Zeichen außerhalb des Standard-ANSI-Bereichs codiert werden.

In einem Multibyte-Zeichensatz werden einige Zeichen durch ein Byte, andere durch mehrere Byte (2, 3 oder 4) dargestellt.

Viele Systeme für die Codierung von Multibyte-Zeichensätzen wurden bereits entwickelt. Beispielsweise ist der Zeichensatz Shift JIS (Codeseite 932) eine Zeichenkodierung für Japanisch. Zeichen in Shift-JIS werden durch ein oder zwei Byte große Codepoints dargestellt. Ein String mit solchen Zeichen ist ein Einzelbyte-String mit Zeichen in einer Codierung mit variabler Länge.

Mit dem Begriff Multibyte-Zeichensatz oder MBCS werden Codeseiten beschrieben, die in Einzelbyte-Strings codiert sind. Solche Codierungen enthalten aus Gründen der Abwärtskompatibilität Einzelbyte-Zeichen. Das erste Byte eines Multibyte-Zeichens wird als führendes Byte bezeichnet. Im Allgemeinen stimmen die ersten 128 Zeichen eines Multibyte-Zeichensatzes mit den 7-Bit-ASCII-Zeichen überein. Jedes Byte, dessen Ordinalwert größer ist als 127, fungiert als führendes Byte eines Multibyte-Zeichens. Daher ist die Interpretation jedes Byte in einem String mit Multibyte-Codierung, der eine Folge von zwei oder mehr Byte enthält, von einem Konvertierungsstatus abhängig, der von den Bytes bestimmt wird, die vorher in der Zeichenfolge vorkommen. Deshalb gibt es nur eine Möglichkeit, um festzustellen, ob ein bestimmtes Byte in einem String ein selbständiges Zeichen darstellt oder Teil eines Multibyte-Zeichens ist: Man muss den String vom Anfang her auswerten und ihn entsprechend zerlegen, wenn ein führendes Byte mit einem Wert größer als 127 gefunden wird.

Wenn Sie eine Anwendung für asiatische Gebietsschemata entwickeln, dürfen Sie deshalb nur mit String-Funktionen arbeiten, die Strings in Multibyte-Zeichen zerlegen können. Aus diesen Gründen können Sie Multibyte-Zeichenstrings nicht wie Einzelbyte-Zeichenstrings verarbeiten. Sie sollten einen für Multibyte-Zeichendaten geeigneten Typ, wie z.B. den Typ AnsiString, verwenden. Die Units AnsiStrings und SysUtils enthalten solche Funktionen.

Die folgenden Units stellen Funktionen zur String-Behandlung und Zerlegung von Strings in Multibyte-Zeichen bereit:

Denken Sie daran, dass die Länge solcher Strings in Byte nicht unbedingt mit der Länge der Strings in Zeichen identisch ist. Achten Sie darauf, dass beim Aufteilen von Strings keine Multibyte-Zeichen abgeschnitten werden. Übergeben Sie in Funktions- oder Prozeduraufrufen keine Multibyte-Zeichen als Parameter, weil die Größe eines Multibyte-Zeichens nicht im voraus bekannt ist. Übergeben Sie stattdessen einen Zeiger auf ein Zeichen oder einen String.

Multibyte-Zeichensätze, insbesondere Doppelbyte-Zeichensätze (DBCS = Double-Byte Character Set), werden in erster Linie für asiatische Sprachen in alten Windows-Betriebssystemen (vor Windows NT) verwendet.

Wide-Zeichen - Unicode

Ideografische Zeichensätze können auch in Unicode repräsentiert werden. Unicode umfasst die beiden folgenden Merkmale:

  • Universeller Zeichensatz enthält mehr als 100.000 Zeichen (Codepoints).
  • Formate zur Unicode-Umwandlung (UTF)-Codierungsschemas. UTF ist eine Zeichencodierung mit variabler Länge für Unicode. UTF kann den gesamten Unicode-Zeichensatz codieren. Unicode kann mit unterschiedlichen Zeichencodierungen implementiert werden. Die gebräuchlichsten Codierungen sind UTF-8 und UTF-16.

Seit Windows NT wurden alle Windows-Versionen mit Unicode entwickelt. Das heißt, dass alle Hauptfunktionen von Windows zum Erstellen von Fenstern, Anzeigen von Text, Durchführen von String-Bearbeitungen usw. Unicode-Strings erfordern. Wenn Sie beim Aufruf einer Windows-Funktion einen ANSI-String (einen String mit 1-Byte-Zeichen) übergeben, konvertiert die Funktion den String zuerst in Unicode und übergibt den Unicode-String dann an das Betriebssystem. Diese Konvertierungen werden im Hintergrund durchgeführt.

Der Unicode-Standard beschreibt ein System für die Darstellung von Zeichen, das weltweit in allen Schriftsystemen verwendet wird. Der universelle Unicode-Zeichensatz kann einen Coderaum von 1.114.112 Zeichen oder Codepoints darstellen. Unicode-Zeichen können je nach Codierung 1, 2, 3 oder 4 Byte lang sein. Die UTF-Codierungssysteme (Unicode Transformation Format) sind äquivalente Darstellungen von Zeichen, die eine problemlose Konvertierung untereinander zulassen:

  • UTF-8 verwendet ein bis vier Byte pro Codepoint. (Es verwendet 1 Byte für alle ASCII-Zeichen und bis zu 4 Byte für andere Zeichen).
  • UTF-32 stellt jedes Zeichen mit vier Byte dar.
  • UTF-16 verwendet entweder zwei oder vier Byte. Zeichen im BMP (Basic Multilingual Plane), der die Schriftzeichen fast aller aktiven Sprachen der Welt enthält, können in zwei Byte (16 Bit) dargestellt werden. Für andere Zeichen ergibt die UTF-16-Codierung ein 16-Bit-Word-Paar, das sogenannte Surrogatpaar. Die ersten 256 Unicode-Zeichen stimmen mit dem ANSI-Zeichensatz überein.

Es wird dringend empfohlen, dass Sie Unicode in Ihren Anwendungen verwenden.

as Betriebssystem Windows unterstützt UTF-16 (das jedes Zeichen einer Folge von numerischen 16-Bit-Werten zuordnet). In Delphii können Unicode-Zeichenstrings mit den Typen UnicodeString oder WideString dargestellt werden.

  • Der Typ WideString repräsentiert einen String mit 2 Byte großen Zeichenelementen. Solche 16-Bit-Zeichen werden als Wide-Zeichen bezeichnet. Ein WideChar ist ein 2 Byte großes Element, und PWideChar ist ein Zeiger auf einen nullterminierten String mit 2 Byte großen Zeichenelementen. Der WideString-Zeichentyp ist im Grunde mit einem Windows-BSTR identisch; daher sollte WideString in COM-Anwendungen verwendet werden. Ein WideString enthält in UTF-16 codierte Zeichen. Da ein Codepoint durch 2 oder 4 Byte repräsentiert werden kann, entspricht die Anzahl der 2-Byte-Elemente in einem WideString nicht notwendigerweise die Anzahl der Zeichen in dem String.
  • Der Typ UnicodeString repräsentiert Unicode-Zeichenstrings. Der Typ UnicodeString verfügt über eine Referenzzählung.

Obwohl der Typ WideString für COM-Anwendungen geeignet ist, verfügt WideString nicht über eine Referenzzählung. UnicodeString ist für andere Anwendungstypen flexibler und effizienter. Darüber hinaus stehen mehr Funktionen für die Behandlung von UnicodeString-Typen als für WideString zur Verfügung, daher wird UnicodeString im Allgemeinen bevorzugt.

Mit dem Typ AnsiString können Einzelzeichen-Strings dargestellt und für MBCS verwendet werden. AnsiString wird nicht für Unicode verwendet. Unicode wird nicht mit dem Begriff MBCS bezeichnet.

Siehe auch