Unicode-Verarbeitung in C ++

107

Was ist die beste Vorgehensweise bei der Unicode-Verarbeitung in C ++?

Fortepianissimo
quelle

Antworten:

81
  • Verwenden Sie die Intensivstation für den Umgang mit Ihren Daten (oder einer ähnlichen Bibliothek).
  • Stellen Sie in Ihrem eigenen Datenspeicher sicher, dass alles in derselben Codierung gespeichert ist
  • Stellen Sie sicher, dass Sie Ihre Unicode-Bibliothek immer für alltägliche Aufgaben wie Zeichenfolgenlänge, Großschreibungsstatus usw. verwenden. Verwenden Sie niemals integrierte Standardbibliotheken wie is_alpha denn, dies ist die gewünschte Definition.
  • Ich kann es nicht genug sagen: Iteriere niemals über die Indizes von a. stringWenn dir die Korrektheit wichtig ist, benutze dafür immer deine Unicode-Bibliothek.
Hazzen
quelle
Es sei denn, Sie behandeln die stringals Binärdaten.
Demi
10

Wenn Sie sich nicht für die Abwärtskompatibilität mit früheren C ++ - Standards interessieren, verfügt der aktuelle C ++ 11-Standard über eine integrierte Unicode-Unterstützung: http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2011 /n3242.pdf

Die wirklich beste Vorgehensweise für die Unicode-Verarbeitung in C ++ wäre daher, die integrierten Funktionen dafür zu verwenden. Bei älteren Codebasen ist dies jedoch nicht immer möglich, da der Standard derzeit so neu ist.

BEARBEITEN: Zur Verdeutlichung ist C ++ 11 Unicode-fähig, da es jetzt Unicode-Literale und Unicode-Zeichenfolgen unterstützt. Die Standardbibliothek unterstützt die Verarbeitung und Konvertierung von Unicode jedoch nur eingeschränkt . Für Ihre aktuellen Bedürfnisse kann dies ausreichen. Wenn Sie jedoch gerade eine große Menge an schwerem Heben ausführen müssen, müssen Sie möglicherweise noch etwas wie die Intensivstation für eine eingehendere Verarbeitung verwenden. Derzeit sind einige Vorschläge in Arbeit , die eine robustere Unterstützung für die Textkonvertierung zwischen verschiedenen Codierungen beinhalten sollen. Ich vermute (und hoffe), dass dies Teil des nächsten technischen Berichts sein wird .

Eestrada
quelle
Dieser Link zu einem Entwurf eines Standarddokuments ist ohne einen Verweis auf einen bestimmten Abschnitt, der die von Ihnen diskutierte "integrierte Unicode-Unterstützung" beschreibt, nicht sehr hilfreich.
Ben Collins
1
@BenCollins Abschnitt 2.14.5 "String-Literale" - Erläutert String-Literale , einschließlich String-Literale für UTF-8-, UTF-16- und UTF-32-Codierungen. Abschnitt 22.4.1.4 "Klassenvorlagencodecvt" - Erläutert die Codecvt-Klasse, die zum Konvertieren zwischen Zeichencodierungen (einschließlich UTF-8, UTF-16 und UTF-32) verwendet wird. Das gesamte Dokument enthält mehr Informationen zur Unicode-Unterstützung, aber dies scheinen die kritischsten Abschnitte zu diesem Thema zu sein.
Eestrada
9

Unser Unternehmen (und andere) verwenden die Open-Source- Bibliothek Internation Components for Unicode (ICU), die ursprünglich von Taligent entwickelt wurde.

Es behandelt Zeichenfolgen, Gebietsschemas, Konvertierungen, Datum / Uhrzeit, Sortierung, Transformationen usw. al.

Beginnen Sie mit dem ICU Userguide

jschroedl
quelle
5

Hier ist eine Checkliste für die Windows-Programmierung:

  • Alle in _T eingeschlossenen Zeichenfolgen ("meine Zeichenfolge")
  • strlen () etc. Funktionen ersetzt durch _tcslen () etc.
  • Verwenden Sie LPTSTR und LPCTSTR anstelle von char * und const char *
  • Stellen Sie beim Starten neuer Projekte in Dev Studio religiös sicher, dass die Option Unicode in Ihren Projekteigenschaften ausgewählt ist.
  • Verwenden Sie für C ++ - Zeichenfolgen std :: wstring anstelle von std :: string
Adam Pierce
quelle
11
Verwenden Sie keine "T" -Strings, -Zeichen und -Funktionen, es sei denn, Sie möchten sowohl Unicode- als auch ANSI-Builds ausführen. Wenn Sie nur Unicode-Builds erstellen möchten, führen Sie einfach normale Zeichen aus: L "meine breite Zeichenfolge" wcslen (L "meine Zeichenfolge") usw.
1800 INFORMATION
Stimmen Sie zu, verwenden Sie _T-Makros nur, wenn Sie generischen Text möchten, dh die Möglichkeit, sowohl für Unicode als auch für Ascii / MBCS zu codieren.
1
Wenn Sie sowohl Unicode- als auch ANSI für C ++ - Zeichenfolgen ausführen möchten, verwenden Sie so etwas wie typedef std :: basic_string <TCHAR> tString;
Serge
Ah ja, ich mache immer #ifdef _UNICODE #define tstring std :: wstring #else #define tstring std :: string #endif, aber ich mag deinen Weg besser Serge.
Adam Pierce
4
Ehrlich gesagt denke ich, dass UTF16 eine Verschwendung ist. Alle Codierungen in UTF8 zu belassen ist einfacher und viel kompatibler mit * nix.
Chacham15
3

Ansehen Vergleich von Zeichenfolgen ohne Groß- und Kleinschreibung in C ++ an

Diese Frage enthält einen Link zur Microsoft-Dokumentation zu Unicode: http://msdn.microsoft.com/en-us/library/cc194799.aspx

Wenn Sie auf der linken Navigationsseite von MSDN neben diesem Artikel nachsehen, sollten Sie viele Informationen zu Unicode-Funktionen finden. Es ist Teil eines Kapitels zum Thema "Codieren von Zeichen" ( http://msdn.microsoft.com/en-us/library/cc194786.aspx) ).

Es hat die folgenden Unterabschnitte:

  • Das Codepage-Modell
  • Doppelbyte-Zeichensätze in Windows
  • Unicode
  • Kompatibilitätsprobleme in gemischten Umgebungen
  • Unicode-Datenkonvertierung
  • Migrieren von Windows-basierten Programmen zu Unicode
  • Zusammenfassung
ine
quelle
2

Obwohl dies möglicherweise nicht für alle die beste Vorgehensweise ist, können Sie Ihre eigenen C ++ UNICODE-Routinen schreiben, wenn Sie möchten!

Ich habe es gerade über ein Wochenende fertig gemacht. Ich habe viel gelernt, obwohl ich nicht garantiere, dass es 100% fehlerfrei ist, habe ich viele Tests durchgeführt und es scheint richtig zu funktionieren.

Mein Code steht unter der neuen BSD-Lizenz und ist hier zu finden:

http://code.google.com/p/netwidecc/downloads/list

Es heißt WSUCONV und wird mit einem Beispielprogramm main () geliefert, das zwischen UTF-8, UTF-16 und Standard-ASCII konvertiert. Wenn Sie den Hauptcode wegwerfen, haben Sie eine schöne Bibliothek zum Lesen / Schreiben von UNICODE.

Willow Schlanger
quelle
1

Wie oben erwähnt, ist eine Bibliothek die beste Wahl, wenn Sie ein großes System verwenden. Manchmal möchten Sie jedoch die Dinge selbst erledigen (möglicherweise, weil die Bibliothek zu viele Ressourcen wie auf einem Mikrocontroller verwendet). In diesem Fall möchten Sie eine einfache Bibliothek, aus der Sie die Teile für die tatsächlich benötigten Dinge kopieren können.

Der Beispielcode von Willow Schlanger scheint gut zu sein (siehe seine Antwort für weitere Details).

Ich habe auch einen anderen gefunden, der kleineren Code hat, aber keine vollständige Fehlerprüfung hat und nur UTF-8 handhabt, aber einfacher war, Teile herauszunehmen.

Hier ist eine Liste der eingebetteten Bibliotheken, die anständig erscheinen.

Eingebettete Bibliotheken

Paul Hutchinson
quelle