Frage

Was sind die Unterschiede zwischen UTF-8, UTF-16 und UTF-32?

Ich verstehe, dass sie alle Speicher Unicode, und dass jeder eine unterschiedliche Anzahl von Bytes verwendet ein Zeichen darzustellen. Gibt es einen Vorteil, einen über die andere wählen?

War es hilfreich?

Lösung

UTF-8 hat einen Vorteil in dem Fall, in dem ASCII-Zeichen, die Mehrheit der Zeichen in einem Textblock darstellen, da UTF-8 alle Zeichen in 8 Bit codiert (wie ASCII). Es ist auch von Vorteil, dass eine UTF-8-Datei nur ASCII-Zeichen enthalten, die gleiche Codierung als ASCII-Datei hat.

UTF-16 besser ist, wo ASCII nicht vorherrschend ist, da es 2 Bytes verwendet pro Zeichen, in erster Linie. UTF-8 startet 3 oder mehr Bytes für die höhere Ordnung Zeichen zu verwenden, wo UTF-16 in nur 2 Bytes bleibt für die meisten Zeichen.

UTF-32 werden alle möglichen Zeichen in 4 Byte abdecken. Dies macht es ziemlich aufgebläht. Ich kann mich keinen Vorteil bei der Verwendung es.

Andere Tipps

Kurz gesagt:

  • UTF-8: Variable-Breite-Codierung, rückwärts kompatibel mit ASCII. ASCII-Zeichen (U + 0000 bis U + 007F) nehmen 1 Byte Codepunkte U + 0080 bis U + 07FF nehmen 2 Bytes, Codepunkte U + 0800 bis U + FFFF nehmen 3 Bytes, Codepunkte U + 10000 bis U + 10FFFF nehmen 4 Bytes. Geeignet für englischen Text, nicht so gut für asiatischen Text.
  • UTF-16: Variable-Breite-Codierung. Codepunkte U + U + 0000 bis FFFF nehmen 2 Bytes, Codepunkte U + 10000 bis U + 10FFFF 4 Bytes nehmen. Bad für englischen Text, gut für die asiatischen Text.
  • UTF-32: mit fester Breite Codierung. Alle Codepunkte nehmen vier Bytes. Ein riesiger Speicher Schwein, aber schnell arbeiten auf. Selten verwendet.

long: siehe Wikipedia: UTF-8 , UTF-16 und UTF-32 .

  • UTF-8 ist variabel 1 bis 4 Bytes.

  • UTF-16 ist variabel 2 oder 4 Bytes.

  • UTF-32 ist fest 4 Bytes.

Unicode definiert einen einzigen großen Zeichensatz, einen einzigartigen Integer-Wert für jedes grafisches Symbol zuweisen (das ist eine wesentliche Vereinfachung und ist nicht wirklich wahr, aber es ist nah genug für die Zwecke dieser Frage). UTF-8/16/32 sind einfach verschiedene Wege, dies zu kodieren.

Kurz gesagt, UTF-32 verwendet 32-Bit-Werte für jedes Zeichen. Das ermöglicht es ihnen, für jedes Zeichen einen Fest-Breite-Code zu verwenden.

UTF-16 verwendet 16-Bit standardmäßig, aber das gibt Ihnen nur 65k mögliche Zeichen, die für den vollständigen Unicode-Satz bei weitem nicht genug. So einige Zeichen verwendet werden Paare von 16-Bit-Werte.

Und UTF-8 verwendet 8-Bit-Werte standardmäßig, was bedeutet, dass die 127 ersten Werte sind feste Breite Single-Byte-Zeichen (das höchstwertige Bit verwendet wird, um anzuzeigen, dass dies der Beginn einer Multi-Byte-Sequenz ist , 7 Bits für den aktuellen Zeichenwert zu verlassen). Alle anderen Zeichen werden als Sequenzen von kodierten bis zu 4 Bytes (wenn der Speicher dient).

Und das führt uns zu den Vorteilen. Alles ASCII-Zeichen ist direkt kompatibel mit UTF-8, so dass für ein Upgrade Legacy-Anwendungen, UTF-8 ist eine gemeinsame und offensichtliche Wahl. In fast allen Fällen wird es auch die am wenigsten Speicher. Auf der anderen Seite, können Sie keine Garantien über die Breite eines Zeichens machen. Es kann 1, 2, 3 oder 4 Zeichen breit, was String-Manipulation erschwert.

UTF-32 ist entgegengesetzt, verwendet es die meisten Speicher (jedes Zeichen ist ein festes 4 Bytes breit), aber auf der anderen Seite, Sie weiß , dass jeder Charakter diese genaue Länge hat, so Schnur Manipulation wird viel einfacher. Sie können die Anzahl der Zeichen in einer Zeichenkette nur aus der Länge in Bytes der Zeichenfolge berechnen. Sie können das nicht mit UTF-8.

UTF-16 ist ein Kompromiss. Es lässt die meisten Zeichen passen in eine feste Breite 16-Bit-Wert. Also, solange Sie nicht über chinesische Symbole, Musiknoten oder einige andere, können Sie davon ausgehen, dass jedes Zeichen 16 Bit breit ist. Es benötigt weniger Speicher als UTF-32. Aber es ist in gewisser Weise „das Schlimmste aus beiden Welten“. Er verwendet fast immer mehr Speicher als UTF-8, und es ist zu vermeiden immer noch nicht das Problem, dass UTF-8 (mit variabler Länge Zeichen) plagt.

Schließlich ist es oft hilfreich, nur mit dem, was die Plattform unterstützt. Windows verwendet UTF-16 intern, so unter Windows, das ist die offensichtliche Wahl.

Linux ändert sich ein wenig, aber sie verwenden in der Regel UTF-8 für alles, was Unicode-kompatibel ist.

So kurze Antwort: Alle drei Codierungen können den gleichen Zeichensatz kodieren, aber sie repräsentieren jedes Zeichen als verschiedene Bytefolgen

.

Unicode ist ein Standard und über UTF-x Sie als technische Umsetzung für einige praktische Zwecke denken kann:

  • UTF-8 - " Größe optimiert ": am besten geeignet für lateinische Zeichen basierte Daten (oder ASCII), dauert es nur 1 Byte pro Zeichen, aber die Größe wächst entsprechend Symbol Vielfalt (und im schlimmsten Fall bis zu 6 Bytes pro Zeichen wachsen)
  • UTF-16 - " Balance ": es dauert mindestens 2 Bytes pro Zeichen, die mit Fest mit einer Größe für bestehenden Satz der Mainstream-Sprachen genug ist, um es zu erleichtern Umgang mit Charakter (aber Größe ist immer noch variabel und kann bis zu 4 Byte pro Zeichen wachsen)
  • UTF-32 - " Leistung ": Damit kann von einfachen Algorithmen als Folge der festen Größe Zeichen verwendet (4 Byte), aber mit Speicher Nachteile

Ich habe versucht, eine einfache Erklärung in meinem Blogpost .

UTF-32

erfordert 32 Bits (4 Bytes) zu kodieren Jede Charakter. Zum Beispiel, um den „A“ Zeichencode-Punkt mit dieser Regelung darstellen, müssen Sie 65 in Binärzahl 32-Bit schreiben:

00000000 00000000 00000000 01000001 (Big Endian)

Wenn Sie einen genaueren Blick, beachten Sie, dass die meisten rechten sieben Bits tatsächlich die gleichen Bits sind, wenn die ASCII-Schema verwendet. Aber da UTF-32 ist feste Breite Schema , müssen wir drei weitere Bytes befestigen. Was bedeutet, dass, wenn wir zwei Dateien, die nur die „A“ Zeichen enthalten, ein ASCII-codiert ist und das andere ist UTF-32 codiert sind, wird ihre Größe entsprechend 1 Byte und 4 Byte sein.

UTF-16

Viele Leute denken, dass als UTF-32 mit fester Breite 32 Bits verwendet einen Code-Punkt darstellen, UTF-16 feste Breite beträgt 16 Bit. FALSCH!

In UTF-16 der Codepunkt repräsentiert vielleicht entweder in 16 Bit oder 32 Bit. So ist dieses Schema mit variabler Länge Codiersystem. Was ist der Vorteil gegenüber der UTF-32? die Größe der Dateien, zumindest für ASCII, wird 4-mal nicht das Original (aber immer noch zweimal), so dass wir noch nicht in ASCII abwärtskompatibel.

Da 7-Bits sind genug, um die „A“ Zeichen darzustellen, können wir verwenden jetzt 2 Bytes statt 4 wie die UTF-32. Es wird wie folgt aussehen:

00000000 01000001

UTF-8

Sie haben richtig geraten .. In UTF-8 der Codepunkt vielleicht mit vertreten entweder 32, 16, 24 oder 8 Bit, und als UTF-16-System, dies ist auch ein variable Längencodierung System.

Schließlich können wir „A“ in der gleichen Art und Weise repräsentieren wir es mit ASCII-Codier-System darstellen:

01001101

Ein kleines Beispiel, in dem UTF-16 tatsächlich besser als UTF-8 ist:

Betrachten Sie den chinesischen Buchstaben "語" - seine UTF-8-Kodierung ist:

11101000 10101010 10011110

Während seine UTF-16-Codierung ist kürzer:

10001010 10011110

Um die Darstellung zu verstehen und wie sie interpretiert, besuchen Sie die Original-Beitrag.

UTF-8

  • hat kein Konzept von Byte-Reihenfolge
  • verwendet zwischen 1 und 4 Bytes pro Zeichen
  • ASCII ist eine kompatible Teilmenge der Codierung
  • vollständig selbst synchronisierenden z.B. ein höchstens ein einzelnes Zeichen
  • Byte von jedem beliebigen Ort in einem Strom Willen korrupt fallen gelassen
  • so ziemlich alle europäischen Sprachen werden in zwei Bytes codiert oder weniger pro Zeichen

UTF-16

  • muss mit bekannten Byte-Reihenfolge oder das Lesen eines Byte-Reihenfolge-Marke (BOM)
  • analysiert werden
  • verwendet entweder 2 oder 4 Byte pro Zeichen

UTF-32

  • jedes Zeichen ist 4 Bytes
  • muss mit bekannten Byte-Reihenfolge oder das Lesen eines Byte-Reihenfolge-Marke (BOM)
  • analysiert werden

UTF-8 wird am meisten Platz effizient sein, wenn nicht eine Mehrheit der Charaktere aus dem CJK ist (Chinesisch, Japanisch und Koreanisch) Zeichenraum.

UTF-32 am besten für den Direktzugriff von Zeichen in ein Byte-Array-Offset ist.

Ich habe einige Tests Datenbankleistung zwischen UTF-8 und UTF-16 in MySQL.

vergleichen

Update Geschwindigkeiten

UTF-8

Geben Sie Bildbeschreibung hier

UTF-16

Geben Sie Bildbeschreibung hier

Einfügen Geschwindigkeiten

Geben Sie Bildbeschreibung hier

Geben Sie Bildbeschreibung hier

Löschen Geschwindigkeiten

Geben Sie Bildbeschreibung hier

Geben Sie Bildbeschreibung hier

In UTF-32 alle Zeichen werden mit 32 Bits codiert. Der Vorteil ist, dass man einfach die Länge der Zeichenfolge berechnen kann. Der Nachteil ist, dass für jedes ASCII-Zeichen Sie ein zusätzlichen drei Bytes verschwenden.

In UTF-8-Zeichen haben variable Länge, ASCII-Zeichen werden in einem Byte (acht Bit) codieren, die meisten westlichen Sonderzeichen codiert sind entweder in zwei Bytes oder drei Bytes (zum Beispiel € sind drei Bytes) und exotischere Zeichen kann bis zu vier Bytes in Anspruch nehmen. Klarer Nachteil ist, dass a priori nicht Zeichenfolge der Länge berechnen kann. Aber es nimmt viel weniger Bytes Latein (Englisch) Alphabet Text zu kodieren, im Vergleich zu UTF-32.

UTF-16 ist auch mit variabler Länge. Zeichen werden in zwei Bytes oder vier Bytes codiert entweder. Ich sehe nicht den Punkt wirklich. Es hat Nachteil, dass sie mit variabler Länge, hat aber nicht den Vorteil des Sparens so viel Platz wie UTF-8 erhielt.

Von den drei, klar UTF-8 ist die am weitesten verbreiteten.

auf Ihrer Entwicklungsumgebung Je Sie nicht einmal die Wahl haben, was Ihren String-Datentyp codiert, wird intern verwendet werden.

Aber für die Speicherung und den Austausch von Daten, die ich immer UTF-8 verwenden würde, wenn Sie die Wahl haben. Wenn Sie hauptsächlich ASCII-Daten haben diese geben Ihnen die kleinste Menge an Daten zu übertragen, während noch in der Lage sein, alles zu kodieren. Die Optimierung für die am wenigsten E / A ist der Weg, auf modernen Maschinen zu gehen.

Wie bereits erwähnt, ist der Unterschied in erster Linie die Größe der zugrunde liegenden Variablen, die in jedem Fall größer werden, mehr Charaktere erlauben zu vertreten.

Allerdings, Schriften, Codierung und Dinge gottlos kompliziert sind (unnötig?), So dass ein großer Link im Detail zu füllen ist erforderlich:

http://www.cs.tut.fi/~jkorpela /chars.html#ascii

Erwarten Sie nicht, alles zu verstehen, aber wenn Sie nicht wollen, Probleme haben, später ist es wert Lernen so viel wie möglich, so früh wie möglich (oder es einfach immer jemand anderes zu klären für Sie) .

Paul.

Kurz gesagt, der einzige Grund für die Verwendung von UTF-16 oder UTF-32 ist jeweils nicht-englische und alte Schriften zu unterstützen.

Ich habe mich gefragt, warum jemand nicht-UTF-8-Codierung haben würde gewählt haben, als es für Web / Programmierung Zwecke offensichtlich effizienter ist.

Ein weit verbreitetes Missverständnis - die nachgestellte Zahl ist nicht ein Hinweis auf seine Fähigkeit. Sie alle unterstützen die vollständige Unicode, nur, dass UTF-8 kann ASCII mit einem einzigen Byte verarbeiten, so ist effizienter / weniger bestechlich an die CPU und über das Internet.

Einige gute Lektüre: http: // www. personal.psu.edu/ejp10/blogs/gotunicode/2007/10/which_utf_do_i_use.html und http://utf8everywhere.org

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