Wenn UTF-8 8 Bit umfasst, bedeutet dies nicht, dass nur maximal 256 verschiedene Zeichen vorhanden sein können?
Die ersten 128 Codepunkte sind dieselben wie in ASCII. Aber es heißt, dass UTF-8 bis zu Millionen von Zeichen unterstützen kann?
Wie funktioniert das?
Antworten:
UTF-8 verwendet nicht immer ein Byte, sondern 1 bis 4 Byte.
Quelle: Wikipedia
quelle
UTF-8 verwendet 1-4 Bytes pro Zeichen: ein Byte für ASCII-Zeichen (die ersten 128 Unicode-Werte sind dieselben wie bei ASCII). Das erfordert aber nur 7 Bits. Wenn das höchste Bit ("Vorzeichen") gesetzt ist, zeigt dies den Beginn einer Mehrbyte-Sequenz an. Die Anzahl der aufeinanderfolgenden hohen Bits gibt die Anzahl der Bytes an, dann eine 0, und die verbleibenden Bits tragen zum Wert bei. Für die anderen Bytes sind die höchsten zwei Bits 1 und 0 und die verbleibenden 6 Bits sind für den Wert.
Eine Vier-Byte-Sequenz würde also mit 11110 beginnen ... (und ... = drei Bits für den Wert), dann drei Bytes mit jeweils 6 Bits für den Wert, was einen 21-Bit-Wert ergibt. 2 ^ 21 überschreitet die Anzahl der Unicode-Zeichen, sodass der gesamte Unicode in UTF8 ausgedrückt werden kann.
quelle
Gemäß dieser Tabelle sollte * UTF-8 Folgendes unterstützen:
2 31 = 2.147.483.648 Zeichen
RFC 3629 hat jedoch die möglichen Werte eingeschränkt, sodass wir jetzt auf 4 Byte begrenzt sind , was uns gibt
2 21 = 2.097.152 Zeichen
Beachten Sie, dass ein guter Teil dieser Zeichen für die benutzerdefinierte Verwendung "reserviert" ist, was für Symbolschriftarten eigentlich sehr praktisch ist.
* Wikipedia verwendet zeigt eine Tabelle mit 6 Bytes - sie haben den Artikel seitdem aktualisiert.
quelle
0xxxxxxx
gibt 7 verwendbare Bits,110xxxxx 10xxxxxx
gibt 11 mehr - es gibt keine Überlappung. Das erste Byte beginnt0
im ersten Fall und1
im zweiten Fall mit.00000001
speichert und was11000000 100000001
speichert?Unicode gegen UTF-8
Unicode löst Codepunkte in Zeichen auf. UTF-8 ist ein Speichermechanismus für Unicode. Unicode hat eine Spezifikation. UTF-8 hat eine Spezifikation. Sie haben beide unterschiedliche Grenzen. UTF-8 hat eine andere Aufwärtsbindung.
Unicode
Unicode wird mit "Ebenen" bezeichnet. Jedes Flugzeug trägt 2 16 Codepunkte. Es gibt 17 Flugzeuge in Unicode. Für insgesamt
17 * 2^16
Codepunkte. Die erste Ebene, Ebene 0 oder BMP , hat ein besonderes Gewicht.Anstatt alle Nuancen zu erklären, möchte ich nur den obigen Artikel über Flugzeuge zitieren.
UTF-8
Kehren wir nun zu dem oben verlinkten Artikel zurück.
So können Sie sehen, dass Sie Dinge in UTF-8 einfügen können, die kein gültiger Unicode sind. Warum? Weil UTF-8 Codepunkte enthält, die Unicode nicht einmal unterstützt.
UTF-8 unterstützt trotz einer Beschränkung auf vier Byte 2 21 Codepunkte, was weit mehr als ist
17 * 2^16
quelle
2.164.864 "Zeichen" können möglicherweise von UTF-8 codiert werden.
Diese Zahl ist 2 ^ 7 + 2 ^ 11 + 2 ^ 16 + 2 ^ 21, was sich aus der Funktionsweise der Codierung ergibt:
1-Byte-Zeichen haben 7 Bits für die Codierung
0xxxxxxx
(0x00-0x7F)2-Byte-Zeichen haben 11 Bit zum Codieren
110xxxxx 10xxxxxx
(0xC0-0xDF für das erste Byte; 0x80-0xBF für das zweite)3-Byte-Zeichen haben 16 Bit zum Codieren
1110xxxx 10xxxxxx 10xxxxxx
(0xE0-0xEF für das erste Byte; 0x80-0xBF für Fortsetzungsbytes)4-Byte-Zeichen haben 21 Bits für die Codierung
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
(0xF0-0xF7 für das erste Byte; 0x80-0xBF für Fortsetzungsbytes)Wie Sie sehen, ist dies deutlich größer als der aktuelle Unicode (1.112.064 Zeichen).
AKTUALISIEREN
Meine anfängliche Berechnung ist falsch, da zusätzliche Regeln nicht berücksichtigt werden. Weitere Informationen finden Sie in den Kommentaren zu dieser Antwort.
quelle
UTF-8 ist eine Codierung mit variabler Länge mit mindestens 8 Bit pro Zeichen.
Zeichen mit höheren Codepunkten benötigen bis zu 32 Bit.
quelle
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
, sodass nur 21 Bit zum Codieren des tatsächlichen Zeichens verwendet werden können.Zitat aus Wikipedia: "UTF-8 codiert jeden der 1.112.064 Codepunkte im Unicode-Zeichensatz mit ein bis vier 8-Bit-Bytes (im Unicode-Standard als" Oktette "bezeichnet)."
Einige Links:
quelle
Lesen Sie den Unicode-Standard und zugehörige Informationen, z. B. den FAQ-Eintrag. UTF-8 UTF-16, UTF-32 und Stückliste . Es ist nicht so reibungslos, aber es sind maßgebliche Informationen, und vieles, was Sie an anderer Stelle über UTF-8 lesen könnten, ist fraglich.
Die "8" in "UTF-8" bezieht sich auf die Länge von Codeeinheiten in Bits. Codeeinheiten sind Entitäten, die zum Codieren von Zeichen verwendet werden, nicht unbedingt als einfache Eins-zu-Eins-Zuordnung. UTF-8 verwendet eine variable Anzahl von Codeeinheiten, um ein Zeichen zu codieren.
Die Sammlung von Zeichen, die in UTF-8 codiert werden können, ist genau die gleiche wie für UTF-16 oder UTF-32, dh alle Unicode-Zeichen. Sie alle codieren den gesamten Unicode-Codierungsbereich, der sogar Nichtzeichen und nicht zugewiesene Codepunkte enthält.
quelle
Obwohl ich mit mpen in Bezug auf die aktuellen maximalen UTF-8-Codes (2.164.864) einverstanden bin (siehe unten, ich konnte seine nicht kommentieren), ist er um 2 Stufen versetzt, wenn Sie die 2 Hauptbeschränkungen von UTF-8 entfernen: nur 4 Bytes Limit und Codes 254 und 255 können nicht verwendet werden (er hat nur das 4-Byte-Limit entfernt).
Der Startcode 254 folgt der Grundanordnung der Startbits (Mehrbit-Flag auf 1 gesetzt, eine Anzahl von 6 1 und Terminal 0, keine Ersatzbits), wodurch Sie 6 zusätzliche Bytes zum Arbeiten erhalten (6 10xxxxxx-Gruppen, zusätzliche 2 ^ 36 Codes).
Der Startcode 255 folgt nicht genau der Grundeinstellung, es wird kein Terminal 0 verwendet, aber alle Bits werden verwendet, wodurch Sie 7 zusätzliche Bytes erhalten (Multi-Bit-Flag auf 1 gesetzt, eine Anzahl von 7 1 und kein Terminal 0, da alle Bits verwendet werden ; 7 10xxxxxx Gruppen, zusätzlich 2 ^ 42 Codes).
Wenn Sie diese hinzufügen, erhalten Sie einen endgültigen maximal darstellbaren Zeichensatz von 4.468.982.745.216. Dies sind mehr als alle derzeit verwendeten Zeichen, alte oder tote Sprachen und alle vermutlich verlorenen Sprachen. Engels- oder Himmelsschrift jemand?
Neben 254 und 255: 128-191 und einigen anderen gibt es auch Einzelbyte-Codes, die im UTF-8-Standard übersehen / ignoriert werden. Einige werden lokal von der Tastatur verwendet, Beispielcode 128 ist normalerweise ein Rückraum zum Löschen. Die anderen Startcodes (und zugehörigen Bereiche) sind aus einem oder mehreren Gründen ungültig ( https://en.wikipedia.org/wiki/UTF-8#Invalid_byte_sequences ).
quelle
Unicode ist fest mit UTF-8 verheiratet. Unicode unterstützt speziell 2 ^ 21 Codepunkte (2.097.152 Zeichen), was genau der Anzahl der von UTF-8 unterstützten Codepunkte entspricht. Beide Systeme reservieren den gleichen "Totraum" und die gleichen Sperrzonen für Codepunkte usw. ... Ab Juni 2018 enthält die neueste Version, Unicode 11.0, ein Repertoire von 137.439 Zeichen
Aus dem Unicode-Standard. Unicode-FAQ
Von der UTF-8 Wikipedia-Seite. UTF-8 Beschreibung
quelle