2010-09-02 10 views
11

Was sind die tragbaren und sauberen Möglichkeiten, Unicode-Zeichenfolgen in C und C++ zu behandeln?Wie behandelt man Unicode-Zeichenfolgen in C/C++?

Außerdem, wie man:

-Lesen Unicode-Strings

-Convert Unicode-Strings in ASCII einige Bytes zu speichern (wenn der Benutzer nur ASCII-Eingänge)

-Print Unicode-Strings

Soll ich auch die Umwelt nutzen? Ich habe zum Beispiel über LC_CTYPE gelesen, sollte es mich als Entwickler interessieren?

+0

Bezogen auf http://stackoverflow.com/questions/3613149/3614105#3614105 – dan04

Antwort

0

Sie müssen Unicode in ASCII lesen, drucken oder konvertieren, wenn es passt? Verwenden Sie einfach UTF-8 und das alles wäre absolut transparent für Sie.

  • Lesen, Schreiben keinen Unterschied
  • ASCII bereits von UTF-8 ist Teilmenge

Für Textanalyse/Verwendung gute Bibliotheken wie ICU Handhabung Boost.Locale oder sogar Qt, Glib, die geben ziemlich Gute Text Analyse/Handhabungstools.

3

Was sind die tragbaren und sauberen Möglichkeiten, Unicode-Zeichenfolgen in C und C++ zu behandeln?

Verwenden Sie eine Bibliothek wie ICU. Wenn Sie nicht können, das ist absolut verrückt, kann nicht Ihre eigenen rollen. Seien Sie bereit, eine harte Zeit obwohl zu haben. Suchen Sie auch nach Unicode.or g Dokumentation zum Beispiel Quellcode.

Sollte ich auch die Umgebung benutzen?

Ja. Sie werden wahrscheinlich auch die std::setlocale Funktion verwenden müssen. Dadurch können Sie ein Gebietsschema festlegen, das der gewünschten Codierung entspricht, z. Wenn Sie britisches Englisch als Sprache und UTF-8 als Kodierung verwenden möchten, erhalten Sie set LC_CTYPE to en_GB.UTF8.

C++ 03 gibt Ihnen keine Möglichkeit, mit Unicode umzugehen. Am besten verwenden Sie den Datentyp wchar_t (und durch die Erweiterung std::wstring). Beachten Sie jedoch, dass die Größen- und Zeichencodierung für verschiedene Betriebssysteme unterschiedlich ist. Z.B. Windows verwendet 2 Bytes für wchar_t und UTF-16-Codierung, während GNU/Linux und Mac OSX 4 Bytes und UTF-32 verwenden.

C++ 0x soll die Situation ändern, indem Unicode-Literale codecvt Facetten, C Unicode TR Unterstützung (lesen Sie <uchar.h>) usw., aber das ist ein langer Weg für die meisten Compiler. (Es gibt ein paar Fragen hier auf SO das sollte Ihnen helfen, loszulegen.)

+1

-1 Std :: wstring! = ** Die ** Unicode-Zeichenfolge; std :: string ist perfekt Unicode-String als std :: wstring! – Artyom

+1

Ich sagte nicht, dass "std :: wstring" Unicode ist. – dirkgently

+0

Mein Punkt ist dies: 'std :: wstring' kann nützlich sein für UTF16 (unter Windows) und UTF32 (unter Mac/Linux). Das größte Problem mit UTF8 ist, dass es sich um eine Codierung mit variabler Breite handelt und daher ein 'char' oder ein' wchar_t' * nicht in der Lage ist, ein Unicode-Zeichen plattformübergreifend darzustellen. – dirkgently

8

Was sind die mehr tragbar und sauber Wege Unicode-Zeichen Sequenzen in C und C++ zu behandeln?

Alle Zeichenfolgen in Ihrem Programm müssen UTF-8, UTF-16, or UTF-32 sein.Wenn Sie aus irgendeinem Grund mit einer Nicht-Unicode-Codierung arbeiten müssen, führen Sie die Konvertierung für die Eingabe und Ausgabe durch.

lesen Unicode-Strings

gleiche Weise können Sie eine ASCII-Datei gelesen hatte. Aber es gibt immer noch viele Nicht-Unicode-Daten, also sollten Sie überprüfen, ob die Daten Unicode sind. Wenn dies nicht der Fall ist (oder UTF-8, wenn Ihre bevorzugte interne Kodierung UTF-32 ist), müssen Sie es konvertieren.

  • UTF-8 und UTF-32 können durch Validierung zuverlässig erkannt werden.
  • UTF-16 kann durch das Vorhandensein einer Stückliste erkannt werden.
  • Wenn es keine UTF-Codierung ist, ist es wahrscheinlich in ISO-8859-1 oder Windows-1252.

Konvertieren Unicode-Strings zu einige Bytes speichern (wenn der Benutzer nur Eingänge ASCII)

Sie nicht in ASCII. Wenn Ihre Daten ausschließlich ASCII sind, nimmt UTF-8 genau den gleichen Speicherplatz ein. Und wenn nicht, verlieren Sie Informationen, wenn Sie in ASCII konvertieren. Wenn Sie sich um das Speichern von Bytes kümmern.

  • Wählen Sie die optimale UTF-Codierung. Für die Zeichen U + 0000 bis U + 007F ist UTF-8 der kleinste. Für die Zeichen U + 0800 bis U + FFFF ist UTF-16 der kleinste.
  • Verwenden Sie Datenkomprimierung wie Gzip. Es gibt eine SCSU-Codierung, die speziell für Unicode entwickelt wurde, aber ich weiß nicht, wie gut sie ist.

Print Unicode-Strings

Schreiben UTF-8 aus nicht anders ASCII zu schreiben.

Außer an der Windows-Eingabeaufforderung, weil es immer noch die alten "OEM" -Seiten verwendet. Dort können Sie WriteConsoleW mit UTF-16-Strings verwenden.

Sollte ich auch die Umgebung benutzen? Ich habe über LC_CTYPE zum Beispiel gelesen, sollte mich das als Entwickler interessieren?

LC_CTYPE ist ein Überbleibsel aus der Zeit, als jede Sprache eine eigene Zeichencodierung hatte und damit seine eigenen ctype.h Funktionen. Heute kümmert sich die Unicode Character Database darum. Die Schönheit von Unicode ist, dass es trennt Zeichencodierung Handhabung von Gebietsschema Handhabung (mit Ausnahme der special uppercase/lowercase rules für Litauisch, Türkisch und Azeri).

Aber jede Sprache hat immer noch eigene Sortierregeln und Zahlenformatierungsregeln, sodass Sie für diese immer noch Gebietsschemata benötigen. Und Sie müssen die Zeichencodierung Ihres Gebietsschemas auf UTF-8 einstellen.

+1

hervorragende Übersicht, insbesondere weil es keine Programmiersprachen-spezifischen Sachen vermeidet –

0

Es gibt gute Antworten hier vor diesem geschrieben, aber keiner von ihnen erwähnt eine bestimmte Sache, die ich als ein wahrscheinliches Problem sehe, da diese Frage auch C Tag hat. Mein C-Wissen ist veraltet, also korrigiere mich bitte, wenn ich falsch liege.

Beachten Sie, dass vermutlich nullterminierte Strings, traditionelle C-String-Funktionen und UTF-16-codierter Datenstrom eine knifflige Kombination darstellen, da in UTF-16 viele westliche alphanumerische Zeichen in zwei Bytes codiert werden, deren anderes Byte Nullen enthält und deshalb ist das Lesen der Zeichendaten als eine Reihe von char s nicht das, was es früher mit Einzelbyte-Zeichensätzen war.

+0

Sie können 0x0000-terminierte Strings mit UTF-16 verwenden. ICU (oben erwähnt) unterstützt dies sehr ausführlich. Sie können nicht davon ausgehen, dass UTF-16 in ein 8-Bit-Zeichen passt, wie Sie festgestellt haben. –

Verwandte Themen