2008-10-05 13 views
32

Ich habe es geschafft, all diese Multi-Byte-Charakter-Sachen größtenteils zu ignorieren, aber jetzt muss ich etwas UI-Arbeit machen und ich weiß, dass meine Ignoranz in diesem Bereich mich einholen wird! Kann jemand in ein paar Absätzen oder weniger genau erklären, was ich wissen muss, damit ich meine Anwendungen lokalisieren kann? Welche Typen sollte ich verwenden (Ich verwende sowohl .Net und C/C++, und ich brauche diese Antwort sowohl für Unix als auch für Windows).UTF8 vs. UTF16 vs Char * vs. was? Jemand erklärt mir dieses Durcheinander!

Antwort

76

Check out Joel Spolsky The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)

EDIT 20.140.523: Auch sehen Characters, Symbols and the Unicode Miracle von Tom Scott auf YouTube - es ist knapp 10 Minuten, und eine wunderbare Erklärung der brillanten 'hacken', das ist UTF-8

+1

Hehe, als ich den Titel gelesen habe, kam mir genau dieser Artikel in den Sinn. – VVS

+0

Ich hatte das vorher nicht gelesen ... habe mein i18n Training durch andere Wege bekommen. Danke für den Link – Akrikos

+2

+1 für einen humorvollen und enorm pädagogischen Artikel. –

25

Eine Zeichenkodierung besteht aus einer Folge von Codes, die jeweils ein Symbol eines gegebenen Zeichensatzes nachschlagen. Bitte sehen Sie diesen guten Artikel auf Wikipedia on character encoding.

UTF8 (UCS) verwendet 1 bis 4 Bytes für jedes Symbol. Wikipedia gibt einen guten Überblick darüber, wie das Multi-Byte-Rundown funktioniert:

  • Das signifikanteste Bit eines Single-Byte-Zeichen ist immer 0.
  • Die höchstwertigen Bits des ersten Bytes eines Mehr -Byte Sequenz bestimmen Sie die Länge der Sequenz. Diese höchstwertigen Bits sind 110 für Zwei-Byte-Sequenzen; 1110 für Drei-Byte-Sequenzen und so weiter.
  • Die verbleibenden Bytes in einer Multi-Byte-Sequenz haben 10 als ihre zwei signifikanten Bits.
  • Ein UTF-8-Stream enthält weder das Byte FE noch FF. Dies stellt sicher, dass ein UTF-8-Stream sieht nie wie ein UTF-16 Strom mit FEFF U + (Byte-Reihenfolge-Marke), beginnend

Die Seite zeigt Ihnen auch einen großen Vergleich zwischen den Vorteilen und Nachteile jedes Zeichencodierungstyps.

UTF16 (UCS2)

Benötigt 2 Bytes für jedes Symbol auf 4 Bytes.

UTF32 (UCS4)

verwendet 4 Bytes immer für jedes Symbol.

char bedeutet nur ein Byte von Daten und ist keine tatsächliche Codierung. Es ist nicht analog zu UTF8/UTF16/ascii. Ein char * -Zeiger kann sich auf jede Art von Daten und jede Kodierung beziehen.

STL:

Beide stl des std :: wstring und std :: string nicht für variabler Länge Zeichen ausgelegt sind Kodierungen wie UTF-8 und UTF-16.

Wie implementieren:

einen Blick auf die iconv Bibliothek nehmen. iconv ist eine leistungsstarke Konvertierungsbibliothek Zeichencodierung von Projekten wie libxml (XML C-Parser von Gnome) verwendet

Andere große Ressourcen auf Zeichencodierung:

+2

Brian, das ist falsch. UTF-16 verwendet 2 bis 4 Bytes. Nur UTF-32 hat eine feste Breite von Bytes (= 4). Die meisten UTF-16-Implementierungen reichen einfach nicht über den BMP hinaus und unterstützen daher nur einen begrenzten Zeichensatz. –

+0

Danke Konrad, ich habe meine Beschreibung aktualisiert. –

+0

Persönlich würde ich in Betracht ziehen, ein char * zu verwenden, um auf UTF16-Daten als Fehler zu verweisen. –

4

Die verschiedenen UTF-Standards sind Möglichkeiten zum Codieren von "Codepunkten". Ein Codepoint ist der Index in den Unicode-Zeichensatz.

Eine andere Codierung ist UCS2, die immer 16bit ist und daher nicht den gesamten Unicode-Bereich unterstützt.

Gut zu wissen ist auch, dass ein Codepunkt nicht gleich einem Zeichen ist. Zum Beispiel kann ein Zeichen wie beispielsweise å sowohl als ein Codepunkt als auch als zwei Codepunkte für das a und eins für den Ring dargestellt werden.

Der Vergleich von zwei Unicode-Zeichenfolgen erfordert daher eine Normalisierung, um die kanonische Darstellung vor dem Vergleich zu erhalten.

1

Es gibt auch das Problem mit Schriftarten. Es gibt zwei Möglichkeiten, mit Schriftarten umzugehen. Entweder Sie verwenden eine riesige Schrift mit Glyphen für alle Unicode-Zeichen, die Sie benötigen (ich denke, dass neuere Versionen von Windows mit einer oder zwei solcher Schriftarten geliefert werden). Oder Sie verwenden eine Bibliothek, die Glyphen aus verschiedenen Zeichensätzen kombinieren kann, die für Teilmengen des Unicode-Standards vorgesehen sind.