Ich bitte um die Anzahl aller möglichen gültigen Kombinationen in Unicode mit Erklärung.
1.111.998 : 17 Flugzeuge × 65.536 Zeichen pro Flugzeug - 2048 Ersatzzeichen - 66 Nichtzeichen
Beachten Sie, dass UTF-8 und UTF-32 theoretisch viel mehr als 17 Ebenen codieren können, der Bereich jedoch aufgrund der Einschränkungen der UTF-16-Codierung eingeschränkt ist .
In Unicode 12.1 werden tatsächlich 137.929 Codepunkte zugewiesen .
Ich verstehe auch nicht, warum Fortsetzungsbytes Einschränkungen haben, obwohl das Startbyte dieses Zeichens löscht, wie lange es sein sollte.
Der Zweck dieser Einschränkung in UTF-8 besteht darin, die Codierung selbstsynchronisierend zu machen .
Betrachten Sie als Gegenbeispiel die chinesische GB 18030-Codierung . Dort wird der Buchstabe ß
als Bytefolge dargestellt 81 30 89 38
, die die Kodierung der Ziffern 0
und enthält 8
. Wenn Sie also eine Zeichenfolgensuchfunktion haben, die nicht für diese codierungsspezifische Eigenart ausgelegt ist, wird bei der Suche nach der Ziffer 8
ein falsches Positiv im Buchstaben gefunden ß
.
In UTF-8 kann dies nicht passieren, da die Nichtüberlappung zwischen Lead-Bytes und Trail-Bytes garantiert, dass die Codierung eines kürzeren Zeichens niemals innerhalb der Codierung eines längeren Zeichens erfolgen kann.
Unicode erlaubt 17 Ebenen mit jeweils 65.536 möglichen Zeichen (oder 'Codepunkten'). Dies ergibt insgesamt 1.114.112 mögliche Zeichen. Derzeit sind nur etwa 10% dieser Fläche zugewiesen.
Die genauen Details, wie diese Codepunkte codiert werden, unterscheiden sich von der Codierung, aber Ihre Frage lässt es so klingen, als würden Sie an UTF-8 denken. Der Grund für Einschränkungen bei den Fortsetzungsbytes liegt vermutlich darin, dass der Anfang des nächsten Zeichens leicht zu finden ist (da Fortsetzungszeichen immer die Form 10xxxxxx haben, das Startbyte jedoch niemals diese Form haben kann).
quelle
Unicode unterstützt 1.114.112 Codepunkte. Es gibt 2048 Ersatzcodepunkte, die 1.112.064 Skalarwerte ergeben. Von diesen gibt es 66 Nicht-Zeichen, was zu 1.111.998 möglichen codierten Zeichen führt (es sei denn, ich habe einen Berechnungsfehler gemacht).
quelle
Um eine metaphorisch genaue Antwort zu geben ,
all of them
.Fortsetzungsbytes in den UTF-8-Codierungen ermöglichen eine Resynchronisation des codierten Oktettstroms angesichts von "Zeilenrauschen". Der Encoder muss lediglich nach einem Byte suchen, das keinen Wert zwischen 0x80 und 0xBF hat, um zu wissen, dass das nächste Byte der Beginn eines neuen Zeichenpunkts ist.
Theoretisch ermöglichen die heute verwendeten Codierungen den Ausdruck von Zeichen, deren Unicode-Zeichennummer bis zu 31 Bit lang ist. In der Praxis wird diese Codierung tatsächlich in Diensten wie Twitter implementiert, bei denen der Tweet mit maximaler Länge Daten im Wert von bis zu 4.340 Bit codieren kann. (140 Zeichen [gültig und ungültig], mal 31 Bit.)
quelle
perl -le 'print ord "\x{1FFF_FFFF_FFFF}"'
druckt 35184372088831 auf einem 64-Bit-Computer aus, führt jedoch auf einem 32-Bit-Computer zu einem Ganzzahlüberlauf. Sie können größere Zeichen wie dieses in Ihrem Perl-Programm verwenden. Wenn Sie jedoch versuchen, sie als utf8 auszudrucken, erhalten Sie eine obligatorische Warnung, es sei denn, Sie deaktivieren Folgendes :perl -le 'print "\x{1FFF_FFFF}"' Code point 0x1FFFFFFF is not Unicode, may not be portable at -e line 1. ######
. Es gibt einen Unterschied zwischen "lose utf8" und "strenge UTF-8": Ersteres ist nicht eingeschränkt.len(chr(0x10000))
, dass ich 2 (Codeeinheiten) gebe. Der Kernel von OS X verwendet UTF-8, richtig - aber die High-Level-APIs (Cocoa usw.) verwenden UTF-16.[𝒜-𝒵]
, und Sie werden sehen, warum ich UTF-16 als Pfusch empfinde. Es ist ein Fehler, Programmierer dazu zu bringen, in Codierungsformularen anstatt in logischen Zeichen zu denken.Unicode hat die hexadezimale Menge von 110000, also 1114112
quelle
Laut Wikipedia enthält Unicode 12.1 (veröffentlicht im Mai 2019) 137.994 verschiedene Zeichen.
quelle