298 Stimmen

Wie viele Bytes umfasst ein Unicode-Zeichen?

Ich bin ein wenig verwirrt über die Kodierungen. Soweit ich weiß, benötigten die alten ASCII-Zeichen ein Byte pro Zeichen. Wie viele Bytes benötigt ein Unicode-Zeichen?

Ich gehe davon aus, dass ein Unicode-Zeichen alle möglichen Zeichen einer beliebigen Sprache enthalten kann - liege ich da richtig? Wie viele Bytes braucht es also pro Zeichen?

Und was bedeuten UTF-7, UTF-6, UTF-16 usw.? Sind das verschiedene Versionen von Unicode?

Ich habe die Wikipedia-Artikel über Unicode aber es ist ziemlich schwierig für mich. Ich bin gespannt auf eine einfache Antwort.

1 Stimmen

18 Stimmen

Tut mir leid, es gibt keine einfache Antwort. Ich finde die ganze Sache ein bisschen verwirrend. Es wurde behauptet, dass Unicode zwei Bytes benötigt und alle Zeichen darstellen kann, aber es hat sich herausgestellt, dass zwei Bytes nicht ganz ausreichend sind.

14 Stimmen

"Einfache Antwort": Ein Unicode-Zeichen benötigt 1-4 Bytes. Unicode deckt viele Sprachen ab, aber nicht alle. Als ich das letzte Mal nachgesehen habe, war Klingonisch zum Beispiel kein offizieller Unicode-Zeichensatz.

8voto

0xC0000022L Punkte 19207

In Unicode ist die Antwort nicht leicht zu geben. Das Problem sind, wie Sie schon sagten, die Kodierungen.

Bei einem englischen Satz ohne diakritische Zeichen wäre die Antwort für UTF-8 so viele Bytes wie Zeichen und für UTF-16 wäre es die Anzahl der Zeichen mal zwei.

Die einzige Kodierung, bei der wir (derzeit) eine Aussage über die Größe machen können, ist UTF-32. Dort sind es immer 32bit pro Zeichen, auch wenn ich mir vorstelle, dass Codepunkte für ein zukünftiges UTF-64 vorbereitet werden :)

Was es so schwierig macht, sind mindestens zwei Dinge:

  1. zusammengesetzte Zeichen, bei denen ein Benutzer statt des bereits akzentuierten/ diakritischen Zeichens (À) den Akzent und das Basiszeichen (`A) kombiniert.
  2. Code-Punkte. Codepunkte sind die Methode, mit der die UTF-Kodierungen mehr kodieren können, als die Anzahl der Bits, die ihnen ihren Namen gibt, normalerweise erlauben würde. UTF-8 bezeichnet z. B. bestimmte Bytes, die für sich genommen ungültig sind, aber, wenn sie von einem gültigen Fortsetzungsbyte gefolgt werden, die Beschreibung eines Zeichens jenseits des 8-Bit-Bereichs von 0..255 ermöglichen. Siehe die Beispiele und Überlange Kodierungen unten im Wikipedia-Artikel über UTF-8.
    • Das ausgezeichnete Beispiel, das dort gegeben wird, ist, dass das €-Zeichen (Codepunkt U+20AC kann entweder dargestellt werden als drei Byte Reihenfolge E2 82 AC o vier Byte Reihenfolge F0 82 82 AC .
    • Beides ist gültig, und das zeigt, wie kompliziert die Antwort ist, wenn man über "Unicode" und nicht über eine bestimmte Kodierung von Unicode, wie UTF-8 oder UTF-16, spricht.

0 Stimmen

Bezüglich des "überlangen" UTF-8-Beispiels (4 statt 3 Bytes) schreiben Sie "...beide [von ihnen] sind gültig..." , aber der verlinkte Wikipedia-Artikel stimmt nicht mehr; <quote> "Längere Kodierungen werden als überlange y sind keine gültigen UTF-8-Darstellungen des Codepunkts. Diese Regel behält eine Eins-zu-Eins-Entsprechung zwischen Codepunkten und ihren gültigen Kodierungen bei, so dass es für jeden Codepunkt eine eindeutige gültige Kodierung gibt. "<end-quote>

0 Stimmen

@GlennSlayden danke, dass Sie den Fehler entdeckt und mich darauf hingewiesen haben. Ich hoffe, das ist jetzt korrigiert. Lieber lösche ich sogar meine hochgestimmte Antwort, als falsche/irreführende Informationen zu verbreiten.

8voto

Nic Cottrell Punkte 8735

Es gibt ein hervorragendes Tool zur Berechnung der Bytes einer beliebigen Zeichenkette in UTF-8: http://mothereff.in/byte-counter

Update: @mathias hat den Code öffentlich gemacht: https://github.com/mathiasbynens/mothereff.in/blob/master/byte-counter/eff.js

5voto

Loduwijk Punkte 1872

Nun, ich habe gerade auch die Wikipedia-Seite dazu aufgerufen, und im Einleitungsteil habe ich gesehen: "Unicode kann durch verschiedene Zeichenkodierungen implementiert werden. Die am häufigsten verwendeten Kodierungen sind UTF-8 (die ein Byte für alle ASCII-Zeichen verwendet, die sowohl in UTF-8 als auch in der ASCII-Kodierung die gleichen Codewerte haben, und bis zu vier Bytes für andere Zeichen), das inzwischen veraltete UCS-2 (das zwei Bytes für jedes Zeichen verwendet, aber nicht alle Zeichen des aktuellen Unicode-Standards kodieren kann)"

Wie dieses Zitat zeigt, besteht Ihr Problem darin, dass Sie davon ausgehen, dass Unicode eine einzige Art der Zeichenkodierung ist. Es gibt tatsächlich mehrere Formen von Unicode, und, wie in diesem Zitat wiedergegeben, eine davon hat sogar 1 Byte pro Zeichen, genau wie Sie es gewohnt sind.

Die einfache Antwort, die Sie hören wollen, lautet also, dass dies unterschiedlich ist.

4voto

Giorgi Tsiklauri Punkte 8206

Unicode es un Standard die eine eindeutige Nummer für jedes Zeichen liefert. Diese eindeutigen Nummern werden als code point s (was nur ein eindeutiger Code ist) für alle in der Welt existierenden Zeichen (einige müssen noch hinzugefügt werden).

Für verschiedene Zwecke kann es erforderlich sein, dass Sie dies darstellen code points in Bytes (die meisten Programmiersprachen tun dies), und hier ist es Character Encoding tritt ein.

UTF-8 , UTF-16 , UTF-32 und so weiter sind alle Character Encodings und die Codepunkte von Unicode werden in diesen Kodierungen auf unterschiedliche Weise dargestellt.

UTF-8 Kodierung hat eine variable Länge, und die darin kodierten Zeichen können 1 bis einschließlich 4 Byte belegen;

UTF-16 hat eine variable Länge, und die darin kodierten Zeichen können entweder 1 oder 2 Byte (d. h. 8 oder 16 Bit) umfassen. Dies stellt nur einen Teil aller Unicode-Zeichen dar, die BMP (Basic Multilingual Plane) genannt werden, und ist für fast alle Fälle ausreichend. Java verwendet UTF-16 Kodierung für seine Zeichenketten und Zeichen;

UTF-32 hat eine feste Länge und jedes Zeichen benötigt genau 4 Bytes (32 Bit).

3voto

prewett Punkte 1538

Bei UTF-16 benötigt das Zeichen vier Bytes (zwei Codeeinheiten), wenn es mit 0xD800 oder höher beginnt; ein solches Zeichen wird als "Surrogatpaar" bezeichnet. Genauer gesagt, hat ein Surrogatpaar die Form:

[0xD800 - 0xDBFF]  [0xDC00 - 0xDFF]

wobei [...] eine Zwei-Byte-Codeeinheit mit dem angegebenen Bereich angibt. Alles <= 0xD7FF ist eine Codeeinheit (zwei Bytes). Alles >= 0xE000 ist ungültig (mit Ausnahme von BOM-Markern, wohlgemerkt).

Voir http://unicodebook.readthedocs.io/unicode_encodings.html , Abschnitt 7.5.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X