Was ist die maximale Anzahl von Bytes für ein einzelnes UTF-8-codiertes Zeichen?
Ich werde die Bytes eines in UTF-8 codierten Strings verschlüsseln und muss daher in der Lage sein, die maximale Anzahl von Bytes für einen UTF-8-codierten String zu ermitteln.
Könnte jemand bitte die maximale Anzahl von Bytes für ein einzelnes UTF-8-codiertes Zeichen bestätigen
Antworten:
Die maximale Anzahl von Bytes pro Zeichen beträgt 4 gemäß RFC3629, wodurch die Zeichentabelle auf Folgendes beschränkt wurde
U+10FFFF
:(Die ursprüngliche Spezifikation erlaubte bis zu sechs Byte-Zeichencodes für vergangene Codepunkte
U+10FFFF
.)Zeichen mit einem Code unter 128 benötigen nur 1 Byte, und die nächsten 1920 Zeichencodes benötigen nur 2 Byte. Wenn Sie nicht mit einer esoterischen Sprache arbeiten, ist das Multiplizieren der Zeichenanzahl mit 4 eine erhebliche Überschätzung.
quelle
11111111
und ein2^(6*7)
bisschen Platz für Zeichen zu haben?Ohne weiteren Kontext würde ich sagen, dass die maximale Anzahl von Bytes für ein Zeichen in UTF-8 ist
Antwort: 6 Bytes
Der Autor der akzeptierten Antwort hat dies korrekt als "ursprüngliche Spezifikation" bezeichnet. Das war gültig durch RFC-2279 1 . Wie J. Cocoe in den Kommentaren unten hervorhob, änderte sich dies 2003 mit RFC-3629 2 , das UTF-8 auf die Codierung für 21 Bit beschränkt, die mit dem Codierungsschema unter Verwendung von vier Bytes verarbeitet werden kann.
Antwort, wenn alle Unicode abgedeckt: 4 Bytes
In Java <= v7 wird jedoch von einem Maximum von 3 Byte für die Darstellung von Unicode mit UTF-8 gesprochen. Dies liegt daran, dass die ursprüngliche Unicode-Spezifikation nur die grundlegende mehrsprachige Ebene ( BMP ) definiert hat, dh es handelt sich um eine ältere Version von Unicode oder eine Teilmenge des modernen Unicodes. Damit
Antwort, wenn nur der ursprüngliche Unicode dargestellt wird, das BMP: 3 Bytes
Das OP spricht jedoch davon, in die andere Richtung zu gehen. Nicht von Zeichen zu UTF-8-Bytes, sondern von UTF-8-Bytes zu einer "Zeichenfolge" der Bytedarstellung. Vielleicht hat der Autor der akzeptierten Antwort dies aus dem Kontext der Frage erhalten, aber dies ist nicht unbedingt offensichtlich, was den gelegentlichen Leser dieser Frage verwirren kann.
Beim Übergang von UTF-8 zur nativen Codierung müssen wir uns ansehen, wie der "String" implementiert ist. Einige Sprachen, wie Python> = 3, repräsentieren jedes Zeichen mit ganzzahligen Codepunkten, was 4 Bytes pro Zeichen = 32 Bit ermöglicht, um die 21, die wir für Unicode benötigen, mit etwas Verschwendung abzudecken. Warum nicht genau 21 Bit? Weil die Dinge schneller sind, wenn sie byteorientiert sind. Einige Sprachen wie Python <= 2 und Java stellen Zeichen mit einer UTF-16-Codierung dar. Dies bedeutet, dass sie Ersatzpaare verwenden müssen, um erweiterten Unicode (nicht BMP) darzustellen. In beiden Fällen sind das immer noch maximal 4 Bytes.
Antwort, wenn UTF-8 -> native Codierung verwendet wird: 4 Bytes
Letztendlich ist 4 die häufigste richtige Antwort, also haben wir es richtig verstanden. Der Kilometerstand kann jedoch variieren.
quelle
1F FF FF
oder 21 Bit dargestellt werden könnten . Die 0x110000-Nummer entspricht den 17 Ebenen mit jeweils 0x10000-Codepunkten.Die maximale Anzahl von Bytes zur Unterstützung von US-ASCII, einer Standardcodierung des englischen Alphabets, beträgt 1. Die Beschränkung des Textes auf Englisch wird jedoch mit der Zeit weniger wünschenswert oder praktisch.
Unicode wurde entwickelt, um die Glyphen aller menschlichen Sprachen sowie viele Arten von Symbolen mit einer Vielzahl von Rendering-Eigenschaften darzustellen. UTF-8 ist eine effiziente Codierung für Unicode, obwohl sie immer noch auf Englisch ausgerichtet ist. UTF-8 ist selbstsynchronisierend: Zeichengrenzen können leicht identifiziert werden, indem in beiden Richtungen nach genau definierten Bitmustern gesucht wird.
Während die maximale Anzahl von Bytes pro UTF-8-Zeichen 3 beträgt, um nur den 2-Byte-Adressraum von Ebene 0, der mehrsprachigen Basisebene (BMP), zu unterstützen, die in einigen Anwendungen als minimale Unterstützung akzeptiert werden kann, beträgt sie 4 für die Unterstützung alle 17 aktuellen Flugzeuge von Unicode (Stand 2019). Es sollte beachtet werden, dass sich wahrscheinlich viele beliebte "Emoji" -Zeichen in Ebene 16 befinden, für die 4 Bytes erforderlich sind.
Dies gilt jedoch nur für Glyphen mit Grundzeichen. Es gibt auch verschiedene Modifikatoren, z. B. das Anzeigen von Akzenten über dem vorherigen Zeichen, und es ist auch möglich, eine beliebige Anzahl von Codepunkten miteinander zu verknüpfen, um ein komplexes "Graphem" zu erstellen. In der realen Programmierung führt die Verwendung oder Annahme einer festen maximalen Anzahl von Bytes pro Zeichen wahrscheinlich zu einem Problem für Ihre Anwendung.
Diese Überlegungen implizieren, dass UTF-8-Zeichenfolgen vor der Verarbeitung nicht wie manchmal zu Arrays fester Länge "erweitert" werden sollten. Stattdessen sollte die Programmierung direkt mit String-Funktionen erfolgen, die speziell für UTF-8 entwickelt wurden.
quelle