2010-02-24 9 views
16

Angenommen, wir haben eine beliebige Zeichenfolge, s.Unicode - im Allgemeinen mit ihm in C++ arbeiten

s hat die Eigenschaft von fast überall auf der Welt zu sein. Leute aus den USA, Japan, Korea, Russland, China und Griechenland schreiben von Zeit zu Zeit in s. Glücklicherweise haben wir jedoch keine Zeitreisenden, die Linear A verwenden.

Für die Gründen der Diskussion, lassen Sie uns gehen wir davon aus String-Operationen wie zu tun:

  • Reverse
  • Länge
  • kapitalisieren
  • Klein
  • Index in

und, nur weil dies für die Diskussion ist, nehmen wir an, dass wir diese Routinen selbst schreiben wollen (anstatt eine Bibliothek zu greifen), und haben wir keine ältere Software zu pflegen.

Es gibt 3 Standards für Unicode: utf-8, utf-16 und utf-32, jeweils mit Vor- und Nachteilen. Aber sagen wir, ich bin irgendwie dumm, und ich möchte, dass ein Unicode sie alle beherrscht (weil das Rollen einer sich dynamisch anpassenden Bibliothek für 3 verschiedene Arten von Zeichenkodierungen, die den Unterschied zum API-Benutzer verbergen, schwer klingt).

  • Welche Codierung ist am allgemeinsten?
  • Welche Codierung wird von wchar_t unterstützt?
  • Welche Codierung wird von der STL unterstützt?
  • Sind diese Kodierungen alle (oder überhaupt nicht) null-terminiert?

-

Der Sinn dieser Frage ist, mich und andere in nützliche und verwertbare Informationen für Unicode zu erziehen: die RFCs zu lesen ist in Ordnung, aber es gibt einen ‚Stapel‘ von Informationen zu Compilern verwandt, Sprachen und Betriebssysteme, die die RFCs nicht abdecken, aber es ist wichtig zu wissen, dass Unicode tatsächlich in einer echten App verwendet wird.

+0

Nicht genau ein Betrogener aber auch gelesen http://stackoverflow.com/questions/114611/what-is-the-best-unicode-library-for-c –

+0

@Martin: Ich bin nicht wirklich interessiert - bei diesem Zeit - was ist die beste Bibliothek? Ich bin eher daran interessiert, mich mit Informationen über Unicode im Allgemeinen vertraut zu machen und darüber, wie ich eine umgekehrte - oder möglicherweise eine obskurere Routine - in Unicode schreiben würde, ohne dass es z. B. in der Türkei explodiert. :-) –

+0

ja das ist, warum ich nicht als dupe geschlossen habe, aber jemand, der diese Frage findet, könnte daran interessiert sein, nur eine Bibliothek zu verwenden. Wenn dieser Thread gute Antworten bekommt, werde ich ihn im anderen Thread referenzieren. –

Antwort

9
  1. Welche Codierung ist allgemeinste
    Wahrscheinlich UTF-32, obwohl alle drei Formate auf jedes Zeichen speichern kann. UTF-32 hat die Eigenschaft, dass jedes Zeichen in einem einzigen Codepunkt kodiert werden kann.

  2. welche Kodierung durch Wchar_t unterstützt wird
    Keine. Das ist die Implementierung definiert. Auf den meisten Windows-Plattformen ist es UTF-16, auf den meisten Unix-Plattformen ist es UTF-32.

  3. Welche Codierung durch die wirklich
    Keine STL unterstützt wird.Die STL kann speichern jede Art von Zeichen, die Sie wollen. Verwenden Sie einfach die std::basic_string<t> Vorlage mit einem Typ, der groß genug ist, um Ihren Codepunkt zu halten. Die meisten Operationen (z. B. std::reverse) wissen jedoch nichts über irgendeine Art von Unicode-Codierung.

  4. Sind diese Kodierungen alle (oder überhaupt nicht) null-terminiert?
    Nein. Null ist ein zulässiger Wert in einer dieser Kodierungen. Technisch gesehen ist NULL auch ein normales ASCII-Zeichen. NULL-Terminierung ist eine C-Sache - keine Kodierungssache.

Die Wahl, wie Sie dies tun, hat viel mit Ihrer Plattform zu tun. Wenn Sie Windows verwenden, verwenden Sie die Zeichenfolgen UTF-16 und wchar_t, da dies die Windows-API zur Unterstützung von Unicode verwendet. Ich bin nicht ganz sicher, was die beste Wahl für UNIX-Plattformen ist, aber ich weiß, dass die meisten von ihnen UTF-8 verwenden.

+2

Auch mit UTF-32 können Sie nicht jedes Zeichen als einen einzigen Codepunkt speichern. Diese Codierung stellt einfach eine 1: 1-Zuordnung zwischen Code-Einheiten und Codepunkten sicher (für die Details zur Terminologie, check out unicode.org) –

+0

Err .. eigentlich kann es. Unicode benötigt 21 Bit für den vollständigen Zeichensatz. UTF-32 bietet 32 ​​Bits in einem einzigen Codepunkt. Zeichen sollten niemals auf UTF-32 geteilt werden. Sie denken an UTF-16. –

+3

Sie sprechen hier über Codepunkte, nicht über Zeichen. Einige (in der Tat viele) Zeichen müssen unabhängig von der Codierung mit mehreren Codepunkten beschrieben werden.Schau dir diesen Link an, zum Beispiel: http://www.unicode.org/faq/char_combmark.html –

5

Werfen Sie einen Blick auf die Open-Source-Bibliothek ICU, insbesondere auf die Docs & Papers section. Es ist eine umfangreiche Bibliothek, die sich mit allen möglichen Unicode-Kuriositäten beschäftigt.

+1

Das OP bat explizit um eine Antwort ohne Bibliothek. –

+2

Deshalb habe ich auf den Abschnitt Docs & Papers verwiesen. Wenn das OP ernsthaft etwas über Unicode-Handhabung erfahren möchte, sollte er nicht auf existierende Lösungen verzichten. ICU bietet nicht nur den Quellcode für die Produktion, sondern auch Design-Dokumente. –

+0

Ah - ich verstehe. +1 dann. –

1

definieren „real app“ :)

Im Ernst, die Entscheidung wirklich viel von der Art der Software, die Sie entwickeln abhängt. Wenn Ihre Zielplattform die Win32-API ist (mit oder ohne Wrapper wie MFC, WTL usw.), würden Sie wahrscheinlich wstring Typen mit dem als UTF-16 kodierten Text verwenden. Das liegt einfach daran, dass alle Win32-APIs diese Codierung ohnehin intern verwenden. Auf der anderen Seite, wenn Ihre Ausgabe etwas wie XML/HTML ist und/oder über das Internet geliefert werden muss, ist UTF-8 so ziemlich der Standard - es wird normalerweise gut über Protokolle übertragen, die Annahmen über Charaktere machen 8 Bits.

Wie bei UTF-32 kann ich mir keinen einzigen Grund für die Verwendung vorstellen, es sei denn, Sie benötigen eine 1: 1-Zuordnung zwischen Code-Einheiten und Codepunkten (dies bedeutet noch nicht 1: 1-Zuordnung zwischen Code-Einheiten und Figuren!).

Weitere Informationen finden Sie unter Unicode.org. This FAQ kann ein guter Ausgangspunkt sein.

+0

Eines ist mir nicht klar: Kann irgendeine der UTF-Kodierungen alle Glyphen repräsentieren, die heute in allen lebenden Sprachschriften verwendet werden? Wenn ich UTF-8 oder UTF-16 auswähle, würde ich mich dann von bestimmten Märkten abkoppeln? –

+2

@Paul. UTF-8, UTF-16 und UTF-32 beschreiben genau die gleichen Daten (Unicode-Codepunkte) nur unterschiedlich codiert, und rein technisch gesehen können Sie jeden von ihnen verwenden, um jeden Unicode-Standard-Text zu speichern (alle lebenden Sprachen sind abgedeckt) . Abgesehen davon müssen Sie auch nicht-technische Probleme berücksichtigen: So schreibt China die Verwendung von GB18030 vor, auch wenn die Standard-Unicode-Kodierungsformulare auch chinesische Buchstaben umfassen. –

2

Als Antwort auf Ihre letzte Aufzählung, wird UTF-8 garantiert keine NULL-Bytes in seiner Codierung eines beliebigen Zeichens (außer NULL selbst, natürlich). Daher funktionieren viele Funktionen, die mit NULL-terminierten Strings arbeiten, auch mit UTF-8-codierten Strings.