Frage

Was ist der Unterschied zwischen UTF und UCS.

Was sind die besten Möglichkeiten, nicht europäische Zeichensätze darzustellen (UTF) in C ++ Strings. Ich möchte Ihre Empfehlungen wissen:

  • Interne Darstellung in dem Code
    • Für String-Manipulation zur Laufzeit
    • Für die Zeichenfolge für die Anzeige verwendet wird.
  • Best-Speicherdarstellung ( d. In Datei)
  • Best auf Draht Transportformat (Übertragung zwischen Anwendung, die auf unterschiedlichen Architekturen sein können und einen anderen Standard locale haben)
War es hilfreich?

Lösung

  

Was ist der Unterschied zwischen UTF und UCS.

UCS Codierungen Breite festgelegt und ist gekennzeichnet durch, wie viele Bytes für jedes Zeichen verwendet werden. Zum Beispiel UCS-2 erfordert 2 Bytes pro Zeichen. Zeichen mit Codepunkten außerhalb des verfügbaren Bereichs können nicht in einer UCS-Codierung codiert werden.

UTF-Codierungen sind variable Breite und durch die minimale Anzahl von Bits markiert ein Zeichen zu speichern. Zum Beispiel UTF-16 benötigt mindestens 16 Bits (2 Bytes) pro Zeichen. Zeichen mit großen Codepunkte werden unter Verwendung einer größeren Anzahl von Bytes codiert -. 4 Byte für Astral Zeichen in UTF-16

  
      
  • Interne Darstellung in dem Code
  •   
  • Best-Speicherdarstellung (das heißt In-Datei)
  •   
  • Best auf Draht Transportformat (Übertragung zwischen Anwendung, die kann   sein auf unterschiedlichen Architekturen und haben   ein anderer Standard locale)
  •   

Für moderne Systeme, die vernünftigste Lagerung und Transport-Kodierung ist UTF-8. Es gibt spezielle Fälle, in denen andere sinnvoll sein könnten - UTF-7 für alten Mail-Server, UTF-16 für schlecht geschriebene Text-Editoren -. Aber UTF-8 ist am häufigsten

Bevorzugte interne Darstellung auf Ihrer Plattform ab. In Windows ist es UTF-16. In UNIX ist es UCS-4. Jeder hat seine guten Seiten:

  • UTF-16-Strings nie mehr Speicher als ein UCS-4-String verwenden. Wenn Sie viele große Strings mit Zeichen in erster Linie in der Grund mehrsprachiger Ebene (BMP) speichern, UTF-16 wird viel weniger Platz als UCS-4 erfordern. Außerhalb der BMP, wird es die gleiche Menge verwendet werden.
  • UCS-4 ist leichter Vernunft zu. Da UTF-16 Zeichen mehr „Ersatzpaare“ über zurückgegeben werden können, kann es schwierig sein, richtig zu spalten oder einen String zu machen. UCS-4 Text hat dieses Problem nicht. UCS-4 auch viel wie ASCII-Text in "char" Arrays handelt, so können vorhandene Text-Algorithmen leicht portiert werden.

Schließlich einige Systeme verwenden UTF-8 als ein internes Format. Das ist gut, wenn man mit dem bestehenden ASCII- oder ISO-8859-basierten Systemen zu inter arbeiten muß, weil NULL-Bytes nicht in der Mitte von UTF-8-Text ist - sie sind in UTF-16 oder UCS-4.

Andere Tipps

Ich würde vorschlagen:

  • Für Darstellung in Code, wchar_t oder gleichwertig.
  • Für die Lagerung Darstellung, UTF-8.
  • Für Draht Darstellung, UTF-8.

Der Vorteil von UTF-8 in der Lagerung und Draht Situationen ist, dass Maschine endianness kein Faktor ist. Der Vorteil eines feste Größe Charakter wie wchar_t in Code ist, dass Sie bequem die Länge eines Strings herausfinden können, ohne dass es scannen zu müssen.

UTC Coordinated Universal Time, kein Zeichensatz (ich keine charset genannt UTC fand).

Für die interne Darstellung, können Sie wchar_t für jedes Zeichen, und std :: wstring für Strings verwenden möchten. Sie verwenden genau 2 Bytes für jedes Zeichen, so sucht und Direktzugriff wird schnell.

Für die Lagerung, wenn die meisten Daten sind nicht ASCII (d code> = 128) haben, können Sie UTF-16 verwenden, die fast die gleiche wie serialisiert wstring und wchar_t ist.

Da UTF-16 Little Endian oder Big-Endian sein kann, für Drahttransport, versuchen Sie es auf UTF-8 zu konvertieren, die Architektur-unabhängig ist.

In der internen Darstellung in dem Code, sollten Sie besser tun dies sowohl für die europäischen und nichteuropäischen Zeichen:

\ unnnn

Zeichen im Bereich \ u0020 \ u007E, und ein wenig von Leerzeichen (z.B. Zeilenende) kann als gewöhnliche Zeichen geschrieben werden. Alles, was über \ u0080, wenn Sie es als ein normales Zeichen schreiben, dann wird es nur in Ihrer Code-Seite (zB OK in Frankreich kompilieren, aber in Russland, OK in Russland zu brechen, aber in Japan, OK in China zu brechen, aber in den USA zu brechen, etc. )..

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top