Unterscheiden sich UTF-8, UTF-16 und UTF-32 in der Anzahl der Zeichen, die sie speichern können?

StackOverflow https://stackoverflow.com/questions/130438

  •  02-07-2019
  •  | 
  •  

Frage

Okay.Ich weiß, das sieht typisch aus „Warum hat er es nicht einfach gegoogelt oder aufgerufen www.unicode.org und nachschlagen? Frage, aber für eine so einfache Frage entzieht sich mir die Antwort immer noch, nachdem ich beide Quellen überprüft habe.

Ich bin mir ziemlich sicher, dass alle drei dieser Kodierungssysteme alle Unicode-Zeichen unterstützen, aber ich muss dies bestätigen, bevor ich diese Behauptung in einer Präsentation aufstelle.

Bonus-Frage:Unterscheiden sich diese Kodierungen in der Anzahl der Zeichen, auf deren Unterstützung sie erweitert werden können?

War es hilfreich?

Lösung

Nein, sie sind einfach verschiedene Codierverfahren. Sie alle unterstützen kodieren, die gleiche Menge von Zeichen.

UTF-8 verwendet überall von einem bis vier Bytes pro Zeichen je nachdem, welche Zeichen Sie codieren. Zeichen im ASCII-Bereich nur ein Byte nehmen, während sehr ungewöhnliche Zeichen vier nehmen.

UTF-32 verwendet vier Bytes pro Zeichen unabhängig davon, welche Zeichen es ist, so wird es immer mehr Platz als UTF-8 die gleiche Zeichenfolge kodieren. Der einzige Vorteil ist, dass man nur durch Zählen Bytes die Anzahl der Zeichen in einem UTF-32-String berechnen kann.

UTF-16 verwendet zwei Bytes für die meisten charactes, vier Bytes für ungewöhnliche.

http://en.wikipedia.org/wiki/Comparison_of_Unicode_encodings

Andere Tipps

Es gibt keine Unicode-Zeichen, die in einer Codierung gespeichert werden kann, aber eine andere nicht. Das ist einfach, weil die gültigen Unicode-Zeichen haben, was beschränkt sind, können in UTF-16 gespeichert werden (was die kleinste Kapazität der drei Codierungen hat). Mit anderen Worten, UTF-8 und UTF-32 und könnte verwendet werden, um ein breiteres Spektrum von Zeichen als UTF-16 zu repräsentieren, aber sie nicht . Lesen Sie für weitere Details.

UTF-8

UTF-8 ist ein Code mit variabler Länge. Einige Zeichen erfordern 1 Byte, einige erfordern 2, etwa 3 und einige 4. Die Bytes für jedes Zeichen werden einfach nacheinander geschrieben als ein kontinuierlicher Strom von Bytes.

Während einige UTF-8-Zeichen 4 Byte lang sein kann, UTF-8 kann nicht codieren 2 ^ 32 Zeichen . Es ist nicht einmal in der Nähe. Ich werde versuchen, die Gründe dafür zu erklären.

Die Software, die ein UTF-8-Stream liest nur eine Folge von Bytes wird - wie es, ob das nächste 4 Bytes entscheiden, sollte ein einzelne 4-Byte-Zeichen ist, oder zwei 2-Byte-Zeichen oder vier 1-Byte Zeichen (oder eine andere Kombination)? Im Grunde ist dies durch die Entscheidung gemacht, dass bestimmte 1-Byte-Sequenzen sind nicht gültige Zeichen und bestimmte 2-Byte-Sequenzen sind keine gültigen Zeichen, und so weiter. Wenn diese ungültigen Sequenzen erscheinen, wird angenommen, dass sie Teil einer mehr bilden Sequenz.

Sie haben ein ganz anderes Beispiel dafür gesehen, ich bin sicher: es entweicht genannt wird. In vielen Programmiersprachen wird entschieden, dass die \ Zeichen in einem Quellcode der Zeichenfolge nicht auf einen beliebigen gültigen Zeichen in der Zeichenfolge des „kompiliert“ Form nicht übersetzen. Teil einer längeren Sequenz zu sein, wie \n oder \xFF Wenn ein \ in der Quelle festgestellt wird, wird angenommen. Beachten Sie, dass \x ist eine ungültige 2-Zeichen-Sequenz und \xF ist eine ungültige 3-Zeichen-Sequenz, aber \xFF ist eine gültige 4-Zeichen-Sequenz.

Im Grunde gibt es einen Trade-off viele Zeichen zwischen und mit kürzeren Zeichen aufweisen. Wenn Sie möchten, 2 ^ 32 Zeichen, die sie benötigen, im Durchschnitt 4 Byte lang sein. Wenn Sie alle Ihre Zeichen 2 Bytes sein wollen oder weniger, dann können Sie nicht mehr als 2 ^ 16 Zeichen lang sein. UTF-8 gibt einen vernünftigen Kompromiss: alle ASCII Zeichen (ASCII 0 bis 127) 1- gegeben Byte-Darstellungen, die für die Kompatibilität ist groß, aber viel mehr Zeichen sind erlaubt.

Wie die meisten Kodierungen variabler Länge, einschließlich der Arten von Escape-Sequenzen oben gezeigt, UTF-8 ist ein momentaner Code . Dies bedeutet, dass der Decoder nur liest Byte für Byte und sobald es das letzte Byte eines Zeichen erreicht, weiß er, was der Charakter ist (und es weiß, dass es nicht der Beginn eines mehr Zeichen).

Zum Beispiel das Zeichen ‚A‘ dargestellt wird, mit der Byte-65, und es gibt keine zwei / drei / vier-Byte-Zeichen, deren erstes Byte 65. Ansonsten ist der Decoder nicht in der Lage sein, diese Zeichen zu sagen, abgesehen von ein 'A' gefolgt von etwas anderem.

Aber UTF-8 noch weiter eingeschränkt. Es sorgt dafür, dass die Codierung eines kürzeren Charakter nie erscheint irgendwo in der Codierung eines längeren Charakter. Zum Beispiel keines des Bytes in einem 4-Byte-Zeichen kann 65 sein.

Da UTF-8 128 verschiedenes 1-Byte-Zeichen hat (deren Bytewerte sind 0-127), alle 2, 3 und 4-Byte-Zeichen müssen ausschließlich von Bytes im Bereich von 128-256 bestehen. Das ist eine große Einschränkung. Allerdings erlaubt es byteorientierte String-Funktionen mit wenig oder gar keiner Änderung zu arbeiten. Zum Beispiel C strstr() Funktion immer wie erwartet funktioniert, wenn seine Eingänge gültig UTF-8-Strings sind.

UTF-16

UTF-16 ist auch ein Code mit variabler Länge; seine Zeichen verbrauchen 2 oder 4 Bytes. 2-Byte-Werte im Bereich 0xD800-0xDFFF sind reserved zur Konstruktion von 4-Byte-Zeichen, und alles 4-Byte-Zeichen besteht aus zwei Bytes, die in dem Bereich 0xD800-0xDBFF 0xDC00-0xDFFF von 2 Bytes im Bereich gefolgt. Aus diesem Grunde weist Sie hat Unicode keine Zeichen im Bereich U + D800-U + DFFF.

UTF-32

UTF-32 ist ein Code mit fester Länge, wobei jedes Zeichen lang 4 Bytes sein. Während dies die Codierung von 2 ^ 32 verschiedenen Zeichen erlaubt, nur Werte zwischen 0 und 0x10FFFF sind in diesem Schema erlaubt.

Kapazitäts Vergleich:

  • UTF-8: 2.097.152 (eigentlich 2.166.912 aber wegen Details auf die gleiche Sache Karte einige von ihnen entwerfen)
  • UTF-16: 1112064
  • UTF-32: 4294967296 (aber beschränkt auf den ersten 1,114,112)

Die meisten eingeschränkt ist daher UTF-16! Die formale Definition Unicode hat die Unicode-Zeichen auf diejenigen beschränkt, die mit UTF-16 (das heißt der Bereich U + 0000 bis U + 10FFFF ohne U + D800 bis U + DFFF) codiert werden können. UTF-8 und UTF-32-Unterstützung all diese Zeichen.

Das UTF-8-System ist in der Tat "künstlich" begrenzt auf 4 Bytes. Es kann bis zu 8 Bytes erweitert werden, ohne die Einschränkungen zu verletzen ich bereits ausgeführt, und dies hat eine Kapazität von 2 ^ 42 ergeben würde. Die ursprüngliche UTF-8-Spezifikation in der Tat bis 6 Bytes erlaubt, die über eine Kapazität von 2 ^ 31 ergibt. Aber RFC 3629 auf 4 Byte begrenzt, denn das ist, wie viel benötigt wird, um alles, was zur Deckung UTF-16 der Fall ist.

Es gibt andere (hauptsächlich historisch) Unicode Codierschemata, insbesondere UCS-2 (das nur zum Codieren von U + U + 0000 bis FFFF fähig ist).

UTF-8, UTF-16 und UTF-32 alle unterstützen den vollen Satz von Unicode-Codepunkten. Es gibt keine Zeichen, die von einem unterstützt werden, jedoch nicht einem anderen.

Wie für die Bonus-Frage „Haben diese Codierungen in der Anzahl der Zeichen unterscheiden sie erweitert werden kann unterstützen?“ Ja und nein. Die Art und Weise UTF-8 und UTF-16 codiert sind, begrenzt die Anzahl der Codepunkte sie auf weniger als 2 ^ 32 unterstützen können. Allerdings wird das Unicode Consortium keine Codepunkte auf UTF-32 hinzuzufügen, die nicht in UTF-8 dargestellt werden kann oder UTF-16. Dies würde den Geist der Codierungsstandards verletzt, und es unmöglich machen, eine Eins-zu-Eins-Abbildung von UTF-32 in UTF-8 (oder UTF-16) zu gewährleisten.

ich persönlich immer überprüfen Joels Post über Unicode-Kodierungen und Zeichensätze, wenn sie in Zweifel.

Alle von der UTF-8/16/32-Codierungen können alle Unicode-Zeichen zuordnen. Siehe Wikipedias Vergleich von Unicode-Codierungen .

Dieses IBM Artikel Encode Ihre XML-Dokumente in UTF-8 ist sehr hilfreich, und zeigt an, wenn Sie die Wahl haben, es besser ist, UTF-8 zu wählen. Vor allem sind die Gründe, breite Werkzeugunterstützung und UTF-8 in der Regel durch Systeme übergeben, die keine Kenntnis von Unicode sind.

Aus dem Abschnitt Was die Spezifikationen sagen in

Wie jeder gesagt hat, können UTF-8, UTF-16 und UTF-32 alle Unicode-Codepunkte kodieren.Die UCS-2-Variante (manchmal fälschlicherweise auch als UCS-16 bezeichnet) kann dies jedoch nicht, und das ist die, die Sie z.B. findenunter Windows XP/Vista.

Sehen Wikipedia für mehr Informationen.

Bearbeiten: Ich irre mich bei Windows, NT war das einzige, das UCS-2 unterstützte.Allerdings gehen viele Windows-Anwendungen wie in UCS-2 von einem einzelnen Wort pro Codepunkt aus, sodass Sie wahrscheinlich auf Fehler stoßen.Sehen ein weiterer Wikipedia-Artikel.(Danke JasonTrue)

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