Development/Tutorials/Localization/Unicode (de): Difference between revisions

    From KDE TechBase
    m (Text replace - "<code cppqt n>" to "<syntaxhighlight lang="cpp-qt" line>")
    m (Text replace - "<code>" to "<syntaxhighlight lang="text">")
    Line 104: Line 104:
    Ein einfacher Weg um Unicode Beispieldaten zu erzeugen ist es, das kde-i18n Paket zu nehmen und dort einige Dateien nach Unicode zu konvertieren, indem man das <tt>recode</tt> Kommandozeilen Werkzeug benutzt.  
    Ein einfacher Weg um Unicode Beispieldaten zu erzeugen ist es, das kde-i18n Paket zu nehmen und dort einige Dateien nach Unicode zu konvertieren, indem man das <tt>recode</tt> Kommandozeilen Werkzeug benutzt.  


    <code>recode KOI8-R..UTF-8      ru/messages/kdelibs.po
    <syntaxhighlight lang="text">recode KOI8-R..UTF-8      ru/messages/kdelibs.po
    recode ISO-8859-1..UTF-16 de/messages/kdelibs.po
    recode ISO-8859-1..UTF-16 de/messages/kdelibs.po
    recode ISO-8859-3..UTF-8  eo/messages/kdelibs.po</code>
    recode ISO-8859-3..UTF-8  eo/messages/kdelibs.po</code>

    Revision as of 20:44, 29 June 2011


    Development/Tutorials/Localization/Unicode


    Einführung in Unicode
    Anleitungsserie   Lokalisation
    Voriges Kapitel   None
    Nächstes Kapitel   Beim Applikationen schreiben an die Lokalisation denken
    Weiterführende Texte   The Unicode website
    Unicode article at Wikipedia
    Unicode for Unix/Linux FAQ
    Navigation   Deutsche Startseite

    Zusammenfassung

    Unicode ist ein Standard der für jedes Zeichen und Symbol in verschiedenen Schreibsystemen rund um die Welt eine eindeutige Nummer zur Verfügung stellt. Dadurch wird die Übersetzung von Software und Texten vereinfacht. Diese Anleitung bietet eine kurze Einführung in Unicode und wie man mit Unicode-Daten unter Qt/KDE arbeitet.

    Was ist Unicode?

    Unicode ist hardware-, entwicklungsplatform und sprachunabhängig. In der Version 5 gibt es Codenummern bis zu 0x10FFFF (doch nicht alle werden benutzt), die ersten 256 Einträge stimmen mit ISO 8859-1 a.k.a. ISO Latin-1 überein. Das bedeutet auch das die ersten 128 Einträge mit dem bekannten ASCII übereinstimmen. Codenummern wurden zugeordnet, um die Implementtion von bereits bestehenden Zeichensätzen zu vereinfachen, daher ist Unicode teilweise mit doppelten Zeichen belegt, damit die Übersetzungstabellen und -logiken kurz gehalten werden können.

    Warum Unicode?

    Benutzt man einen bestehenden Zeichensatz wie ISO 8859-15 ist es schwer, Dokumente zu erzeugen, die mehrere Sprachen beninhalten. Diese Dokumente können nur mit Personen ausgetauscht werden, die den gleichen Zeichensatz benutzen. Und auch haben mehrere Schreibsysteme mehr Zeichen als durch eine 8-bit Darstellung eindeutig zugewiesen werden können.

    Aus diesem Grund ist Unicode der beste Weg verschiedene Sprachen und Zeichen in einem Dokument zu vermischen und diese Dokumente mit Personen auszutauschen, die unterschiedliche Sprachen verwenden. Unicode macht es zum Beispiel möglich so etwas wie ein Russisch-Ungarisches Wörterbuch zu schreiben.

    UTF-8 und UTF-16

    UTF steht für "Unicode Transformation Format". Die beiden am häufigsten verwendeten Varianten, UTF-8 und UTF-16, definieren, wie der einem Unicode-Zeichen zugeordnete Codenummer in Bits ausgedrückt wird.

    In UTF-16 wird jedes Zeichen durch einen 16-bit Wert seiner Unicode-Nummer dargestellt. So ist zum Beispiel in UTF-16 b (LATIN SMALL LETTER B) repräsentiert als 0x0062. Es gibt auch Ersatzpaare um Werte über 0xFFFF zu codieren. In UTF-8 werden die Unicode Zeichen in einem Strom von Bytes in einem bestimmten Verschlüsselungsschema dargestellt, welches in [1] und [2] beschrieben wird. Anders als UTF-16 ist es damit kompatibel zu ASCII. Höhere Codenummern benötigen zwei oder drei Bytes um verschlüsselt zu werden, selten mehr.

    Unicode in KDE Applikationen

    Unicode Zeichenketten im Arbeitsspeicher ablegen und auf dem Bildschirm darzustellen ist mit Qt:String und QChar, da diese beiden Klassen, für Ihre Applikation völlig transparent, volle Unicode Unterstützung bieten.

    QString und QChar benutzen intern beide UTF-16. Wenn Sie Textabschnitte aus einer 8-bit Quelle lesen oder in eine schreiben (z.B. QTextStream), müssen Sie ein QTextCodec benutzen, um den Text zwischen den beiden Darstellungen zu konvertieren. Normalerweise würden Sie ein UTF-8 Codec benutzen, um eine Unicode Zeichenkette zwischen QByteArray und QString zu konvertieren.

    Um das passende Unicode QTextCodec zu erhalten, benutzen Sie einfach:

    <syntaxhighlight lang="cpp-qt" line>QTextCodec Utf8Codec = QTextCodec::codecForName("utf-8"); QTextCodec Utf16Codec = QTextCodec::codecForName("utf-16");

    Anzeige

    Jedes Widget das QString oder QChar zur Textdarstellung benutzt ist in der Lage Unicode Zeichen auszugeben, solange die passende Schriftart installiert ist.

    Für eine flexible Textbearbeitung und -darstellung sehen Sie bitte auch in der Qt Dokumentation zu Rich-Text-Verarbeitung nach. Das Scribe System bietet eine Reihe von Klassen rund um die QTextDocument-Klasse an, die es einfach macht, Unicode zu benutzenden, formatierten Text richtig darzustellen und zu drucken.

    In-Memory Puffer

    Um Unicode Daten aus einem In-Memory Puffer, wie QByteArray, zu lesen, kann man die schon oben beschreibenen Codecs benutzen:

    <syntaxhighlight lang="cpp-qt" line> QByteArray buffer;

    // UTF-16 QString string = Utf16Codec->toUnicode(buffer);

    // UTF-8 QString string = Utf8Codec->toUnicode(buffer);

    In einen Puffer zu schreiben sieht ähnlich aus:

    <syntaxhighlight lang="cpp-qt" line> QString string; // Mein Unicode Text QByteArray array; // Puffer um UTF-16 Unicode zu speichern QTextStream textStream(array, IO_WriteOnly);

    textStream.setEncoding(QTextStream::Unicode); textStream << string;

    Dateibehandlung

    Für das Speichern und Lesen aus und in eine Datei sollten KDE Applikationen eine Option anbieten, den Text statt im lokalen Zeichensatz in Unicode zu bearbeiten. Auf diese Art kann der Benutzer Ihrer Applikation Dokumente im lokalen Zeichensatz als Voreinstellung lesen und schreiben, gleichzeitig aber optional in Unicode. Sowohl UTF-8 als auch UTF-16 sollten unterstützt werden. Europäische Benutzer werden eher UTF-8 vorziehen, während Asiatische UTF-16 bevorzugen.

    Unicode Daten aus einer Textdatei zu lesen wird im folgenden Beispiel demonstriert. Dabei werden die QTextCodecs benutzt, die bereits oben für UTF-8 Daten erwähnt wurden:

    <syntaxhighlight lang="cpp-qt" line>QTextStream textStream; QString line;

    // UTF-16, wenn die Datein mit einer Unicode Marke anfängt // ist die Voreinstellung ok, sonst: // textStream.setEncoding(QTextStream::Unicode); line = textStream.readLine();

    // UTF-8 textStream.setCodec(Utf8Codec); line = textStream.readLine();

    Schreiben ist ähnlich einfach, ebenfalls kommen die QTextCodecs von oben zum Einsatz:

    <syntaxhighlight lang="cpp-qt" line>QTextStream textStream; QString line;

    // UTF-16 textStream.setEncoding(QTextStream::Unicode); textStream << line;

    // UTF-8 textStream.setCodec(Utf8Codec); textStream << line;

    Unicode Zeicheneingabe

    In der Lage zu sein, Unicode zu laden, speichern und darstellen ist nur ein Teil des Puzzles. Ein entscheidendes Stück ist es noch, dem Benutzer die Eingabe von Unicode-Zeichen zu erlauben. Das wird im allgemeinen durch das Benutzen von Plattform-spezifischen multibyte Eingabemethoden (IM) benutzt, wie XIM auf X11. KDE bietet eine gute Unterstützung für diese Eingabemethoden über Qt und Ihre Applikation sollte nichts weiteres benötigen, um solche Eingaben zu ermöglichen.

    Einfache Unicode Dateien und Schrifttypen

    Ein einfacher Weg um Unicode Beispieldaten zu erzeugen ist es, das kde-i18n Paket zu nehmen und dort einige Dateien nach Unicode zu konvertieren, indem man das recode Kommandozeilen Werkzeug benutzt.

    <syntaxhighlight lang="text">recode KOI8-R..UTF-8 ru/messages/kdelibs.po recode ISO-8859-1..UTF-16 de/messages/kdelibs.po recode ISO-8859-3..UTF-8 eo/messages/kdelibs.po

    Die Mehrheit der aktuellen Betriebssysteme enthalten bereits eine Unicode TrueType Schriftart, siehe auch [3].