Falls eine Alien-Invasion stattfand und wir gezwungen waren, ihre Sprachen in allen unseren vorhandenen Computersystemen zu unterstützen, wurde UTF-8 so entwickelt, dass die möglicherweise große Anzahl von Zeichen berücksichtigt werden kann?
(Natürlich wissen wir nicht, ob Ausländer tatsächlich Sprachen haben, ob oder wie sie kommunizieren, aber bitte stellen Sie sich vor, dass dies der Argumentation zuliebe der Fall ist.)
Wenn zum Beispiel ihre Sprache aus Millionen von neu gefundenen Glyphen, Symbolen und / oder kombinierten Zeichen besteht , könnte UTF-8 theoretisch auf eine nicht unterbrechende Weise erweitert werden, um diese neuen Glyphen einzuschließen und dennoch die gesamte vorhandene Software zu unterstützen?
Ich bin mehr daran interessiert, ob die Glyphen die aktuellen Größenbeschränkungen bei weitem übertroffen haben und mehr Bytes erforderlich sind, um eine einzelne Glyphe darzustellen. Falls UTF-8 nicht erweitert werden konnte, beweist dies, dass der einzige Vorteil gegenüber UTF-32 einfach die Größe kleinerer Zeichen ist?
Antworten:
Der Unicode-Standard bietet viel Platz. Die Unicode-Codepunkte sind in "Ebenen" und "Blöcke" unterteilt. Von insgesamt 17 Flugzeugen sind derzeit 11 nicht zugeordnet . Jede Ebene enthält 65.536 Zeichen, so dass realistisch gesehen eine halbe Million Codepunkte für eine fremde Sprache übrig bleiben (es sei denn, wir füllen das alles vor dem ersten Kontakt mit mehr Emoji auf). Seit Unicode 8.0 wurden insgesamt nur 120.737 Codepunkte zugewiesen (ungefähr 10% der Gesamtkapazität), wobei ungefähr derselbe Betrag nicht zugewiesen, aber für die private, anwendungsspezifische Verwendung reserviert ist. Insgesamt sind 974.530 Codepunkte nicht zugewiesen.
UTF-8 ist eine spezielle Unicode-Codierung und derzeit auf vier Bytes pro Codepunkt beschränkt, was den Einschränkungen von UTF-16 entspricht. Insbesondere unterstützt UTF-16 nur 17 Flugzeuge. Zuvor unterstützte UTF-8 6 Oktette pro Codepunkt und war für die Unterstützung von 32768-Flugzeugen ausgelegt. Im Prinzip könnte dieses 4-Byte-Limit aufgehoben werden, aber dies würde die aktuelle Organisationsstruktur von Unicode sprengen und eine schrittweise Abschaffung von UTF-16 erfordern - was angesichts der Verankerung in bestimmten Betriebssystemen und Programmen in naher Zukunft unwahrscheinlich ist Sprachen.
Der einzige Grund, warum UTF-16 immer noch häufig verwendet wird, ist die Erweiterung der fehlerhaften UCS-2-Codierung, die nur eine einzige Unicode-Ebene unterstützt. Andernfalls erbt es unerwünschte Eigenschaften von UTF-8 (nicht mit fester Breite) und UTF-32 (nicht ASCII-kompatibel, Platzverschwendung für gemeinsame Daten) und benötigt Byte-Ordnungszeichen, um die Endianität zu deklarieren. Angesichts der Tatsache, dass UTF-16 trotz dieser Probleme immer noch beliebt ist, bin ich nicht zu optimistisch, dass sich dies sehr bald von selbst ändern wird. Hoffentlich werden unsere neuen außerirdischen Overlords dieses Hindernis für ihre Herrschaft bemerken und UTF-16 in ihrer Weisheit vom Erdboden verbannen .
quelle
wfopen
Syscall oder irgendetwas anderes, es ist UTF8 den ganzen Weg. Sogar Python und Java - beide, die aus historischen Gründen Strings als UTF-16 definieren - speichern Strings nur dann als UTF-16, wenn dies erforderlich ist. Speicher ist teuer, CPU ist billig). Gleiches gilt für Android - der JString des NDK ist UTF8, vor allem, weil Google-Ingenieure nicht verrückt sind.Wenn UTF-8 tatsächlich erweitert werden soll, sollten wir uns das absolute Maximum ansehen, das es darstellen könnte. UTF-8 ist folgendermaßen aufgebaut:
(Schamlos aus dem RFC kopiert .) Wir sehen, dass das erste Byte immer steuert, wie viele Folgebytes das aktuelle Zeichen bilden.
Wenn wir es auf bis zu 8 Byte erweitern, erhalten wir die zusätzlichen Nicht-Unicode-Darstellungen
Berechnung der maximal möglichen Darstellungen, zu denen wir mit dieser Technik kommen können
oder in Basis 10:
Dies gibt uns die maximale Anzahl von Darstellungen als 4.468.982.745.216.
Also, wenn diese 4 Milliarden ( oder Billionen, wie Sie möchten ) Zeichen ausreichen, um die fremden Sprachen zu repräsentieren, bin ich ziemlich sicher, dass wir mit minimalem Aufwand die aktuelle UTF-8 erweitern können, um unseren neuen fremden Overlords zu gefallen ;-)
quelle
111111xx
, enthält ein mögliches erstes Byte, gefolgt von fünf Erweiterungsbytes für maximal 2³² Codepunkte. Dies ist jedoch nur mit der Definition kompatibel, die Sie für die ersten 2³¹-Codepunkte angegeben haben.F4 8F BF BF
in UTF-8 Bytes). Alles, was ich hier darüber hinaus erwähne, ist reine Spekulation. Natürlich könnte sich jemand andere Erweiterungen vorstellen, bei denen ein hohes erstes Byte eine andere folgende Struktur anzeigt (und hoffentlich die Selbstsynchronisation dabei nicht zerstört). Ich habe versucht, das Byte-Schema so zu vervollständigen, dass es dem echten UTF-8-Format so nahe wie möglich kommt.FF
eine 13-Byte-Codeeinheit ein, die 72 Bit speichern kann. Alles über 2 ^ 36 ist einheitlich sehr teuer, aber es ermöglicht das Codieren eines 64-Bit-Int und noch mehr.RFC3629 beschränkt UTF-8 auf maximal vier Bytes pro Zeichen mit einem Maximalwert von 0x10FFFF, sodass maximal 1.112.064 Codepunkte zulässig sind. Offensichtlich könnte diese Einschränkung aufgehoben und der Standard erweitert werden, aber dies würde eine bahnbrechende Änderung für vorhandenen Code darstellen, der bis zu dieser Grenze funktioniert.
Aus der Sicht von Datendateien wäre dies keine bahnbrechende Änderung, da der Standard davon ausgeht, dass das nächste Byte Teil der Codierung ist, wenn das höchstwertige Bit (MSB) jedes Bytes gesetzt ist. Bereits vor RFC3629 war der Standard auf 31 Bit begrenzt, so dass das MSB des vierten Bytes nicht gesetzt war.
Eine Erweiterung des Standards über 0x10FFFF hinaus würde jedoch die teilweise Datenkompatibilität von UTF-8 mit UTF-16 beeinträchtigen.
quelle
Tatsächlich stehen nur 2 Unicode-Code-Punkte für unendlich viele Glyphen, wenn sie Zeichen kombinieren.
Vergleichen Sie beispielsweise die beiden Möglichkeiten, die Unicode für das koreanische Hangul-Alphabet verwendet: Hangul-Silben und Hangul-Jamo . Das Zeichen 웃 in
Hangul Syllabels
ist der einzelne Codepunkt,C6C3
während inHangul Jamo
ihm die drei Codepunkte110B
(ㅇ)116E
(ㅜ)11B9
(ㅅ) stehen. Das Kombinieren von Zeichen benötigt offensichtlich erheblich weniger Codepunkte, ist jedoch für das Schreiben weniger effizient, da zum Schreiben jedes Zeichens mehr Bytes erforderlich sind.Mit diesem Trick muss die Anzahl der Codepunkte, die derzeit in UTF-8 oder UTF-16 codiert werden können, nicht überschritten werden.
Ich denke, es kommt darauf an, wie beleidigt die Außerirdischen wären, wenn ihre Sprache viel mehr Bytes pro Nachricht benötigt als irdische Sprachen. Wenn es ihnen zum Beispiel nichts ausmacht, jede ihrer Millionen Zeichen mit einem Durcheinander von 100.000 Zeichen darzustellen, ist das kein Problem. Auf der anderen Seite, wenn sie gezwungen werden, mehr Bytes als Erdlinge zu verwenden, fühlen sie sich wie Bürger zweiter Klasse, könnten wir in einen Konflikt geraten ( nicht anders als das, was wir bereits mit UTF-8 beobachten ).
quelle
Bearbeiten: Die Frage lautet jetzt "Millionen neuer Charaktere". Dies macht es einfach zu beantworten:
Nein . Utf-8 ist eine Unicode-Codierung. Unicode verfügt über einen Codespace, der 1.114.112 verschiedene Codepunkte zulässt , und weniger als eine Million ist derzeit nicht zugewiesen. Es ist daher nicht möglich, Millionen neuer Zeichen in Unicode zu unterstützen. Per Definition kann keine Unicode-Codierung mehr Zeichen unterstützen als von Unicode definiert. (Natürlich können Sie betrügen, indem Sie eine Ebene weiter kodieren - jede Art von Daten kann immerhin durch nur zwei Zeichen dargestellt werden.)
So beantworten Sie die ursprüngliche Frage:
Unicode unterstützt keine Sprachen als solche, sondern Zeichen - Symbole, mit denen die Sprache in schriftlicher Form dargestellt wird.
Da nicht alle menschlichen Sprachen eine schriftliche Darstellung haben, können nicht alle menschlichen Sprachen von Unicode unterstützt werden. Darüber hinaus kommunizieren viele Tiere, haben aber keine geschriebene Sprache. Wale haben beispielsweise eine Kommunikationsform, die komplex genug ist, um eine Sprache zu nennen, aber keine schriftliche Form hat (und auch nicht mit der vorhandenen phonetischen Notation erfasst werden kann). Somit können nicht einmal alle Sprachen der Welt von Unicode unterstützt werden.
Noch schlimmer ist so etwas wie die Sprache der Bienen. Es hat nicht nur keine schriftliche Form, es kann auch nicht sinnvoll in schriftlicher Form dargestellt werden. Die Sprache ist eine Art Tanz, der grundsätzlich in eine Richtung weist, sich aber auf den aktuellen Sonnenstand stützt. Daher hat der Tanz nur an dem bestimmten Ort und zu dem Zeitpunkt, an dem er aufgeführt wird, einen informativen Wert. Eine symbolische oder textuelle Darstellung müsste Informationen (Standort, Sonnenstand) enthalten, die die Sprache der Bienen derzeit nicht ausdrücken kann.
Sogar eine schriftliche oder symbolische Form der Kommunikation kann möglicherweise nicht in Unicode dargestellt werden. Beispielsweise können Illustrationen oder wortlose Comics von Unicode nicht unterstützt werden, da die Menge der Glyphen nicht endlich ist. Sie werden eine Menge Bildkommunikation in internationalen Umgebungen wie einem Flughafen bemerken, daher ist es nicht unvorstellbar, dass sich eine Rasse von Außerirdischen in der Raumfahrt entwickelt hat, um eine Bildsprache zu verwenden.
Selbst wenn eine fremde Rasse eine Sprache mit einem Schriftsystem mit einem endlichen Satz von Symbolen hätte, könnte dieses System in Unicode möglicherweise nicht unterstützt werden. Unicode erwartet, dass das Schreiben eine lineare Folge von Symbolen ist. Die Musiknotation ist ein Beispiel für ein Schriftsystem, das in Unicode nicht vollständig dargestellt werden kann, da die Bedeutung sowohl bei der Auswahl der Symbole als auch bei der vertikalen und horizontalen Platzierung codiert wird. (Unicode unterstützt einzelne Musiksymbole, kann jedoch keine Partitur codieren.) Eine fremde Rasse, die mit polyphoner Musik (nicht ungewöhnlich) oder einem Kommunikationskanal ähnlicher Komplexität kommuniziert, verfügt möglicherweise über ein Schriftsystem, das wie eine Orchestermusik aussieht Unicode kann dies nicht unterstützen.
Nehmen wir jedoch zum Zwecke der Argumentation an, dass alle Sprachen, auch fremde Sprachen, als lineare Folge von Symbolen ausgedrückt werden können, die aus einer endlichen Menge ausgewählt werden. Ist Unicode groß genug für eine Alien-Invasion? Unicode verfügt derzeit über weniger als eine Million nicht zugeordnete Codepunkte. Die chinesische Sprache enthält nach dem umfassendsten chinesischen Wörterbuch hunderttausende Zeichen (derzeit werden nicht alle von Unicode als unterschiedliche Zeichen unterstützt). Daher würden nur zehn Sprachen mit der Komplexität von Chinesisch den gesamten Unicode-Code verbrauchen. Auf der Erde gibt es Hunderte von unterschiedlichen Schriftsystemen, aber zum Glück sind die meisten eher alphabetisch als ideografisch und enthalten daher nur eine geringe Anzahl von Zeichen. Wenn alle geschriebenen Sprachen Ideogramme wie Chinesisch verwenden würden, wäre Unicode nicht einmal groß genug für die Erde. Die Verwendung von Alphabeten leitet sich aus der Sprache ab, in der nur eine begrenzte Anzahl von Phonemen verwendet wird, dies gilt jedoch insbesondere für die menschliche Physiologie. Selbst ein einziger fremder Planet mit nur einem Dutzend ideografischer Schriftsysteme könnte also über das hinausgehen, was Unicode unterstützen kann. Überlegen Sie nun, ob diese Außerirdischen bereits in andere Planeten vor der Erde eingedrungen sind und ihre Schriftsysteme in den Zeichensatz aufgenommen haben, der unterstützt werden muss.
Die Erweiterung oder Änderung aktueller Codierungen oder die Einführung neuer Codierungen wird dies nicht lösen, da die Beschränkung in der Anzahl der von Unicode unterstützten Codepunkte liegt.
Die Antwort lautet also höchstwahrscheinlich nein.
quelle