Was ist der Sinn von UTF-16?
Ich habe nie verstanden, den Punkt der UTF-16-Codierung. Wenn Sie brauchen, um in der Lage sein zu behandeln strings als random access (also ein code, der Punkt ist das gleiche wie eine code-Einheit), müssen Sie die UTF-32, da UTF-16 ist noch variabler Länge. Wenn Sie dies nicht brauchen, dann UTF-16 scheint wie eine kolossale Verschwendung von Platz im Vergleich zu UTF-8. Was sind die Vorteile von UTF-16 über UTF-8 und UTF-32 und warum Windows-und Java als native Kodierung?
- Vielleicht könnte man formulieren Sie Ihre Frage nicht so subjektiv und streitbar?
- Wenn es nur wahr für UTF-32... Spiele 5 Minuten mit der Kombination der Zeichen " en.wikipedia.org/wiki/Combining_character und die sagen mir, wie viel "Zufall" ist alles 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Windows NT wurde entwickelt, UTF-16 nicht vorhanden (NT 3.51 wurde geboren in 1993, während UTF-16 wurde geboren im Jahr 1996 mit dem Unicode-standard 2.0); es wurde statt dessen UCS-2, die, zu dieser Zeit, war genug, um jedes Zeichen im Unicode-Zeichensatz verfügbar, so dass der 1 code point = 1 code unit equivalence war tatsächlich wahr ist - nicht-variable-Länge-Logik benötigt für Streicher.
Zog Sie in UTF-16 später, zur Unterstützung des gesamten Unicode-Zeichensatz, aber Sie konnte sich nicht bewegen, um UTF-8 oder UTF-32, da diese gerissen hätten Binär-Kompatibilität, die in der API-Schnittstelle (unter anderem).
Als für Java, ich bin mir nicht wirklich sicher, seit es veröffentlicht wurde ~1995 vermute ich, dass UTF-16 war bereits in der Luft (auch wenn es nicht standardisiert noch), aber ich denke, dass die Kompatibilität mit NT-basierten Betriebssystemen kann haben eine Rolle gespielt in Ihrer Wahl (kontinuierliche UTF-8 <-> UTF-16-Konvertierung für jeden Aufruf von Windows-APIs vorstellen können, eine Verlangsamung).
Bearbeiten
Wikipedia erklärt, dass auch für Java ging es in der gleichen Weise: er ursprünglich unterstützt UCS-2, aber verschoben, um UTF-16 in J2SE 5.0.
So, im Allgemeinen, wenn Sie sehen, UTF-16 verwendet, in einigen API/Framework ist es, weil es begann als UCS-2 (um Komplikationen zu vermeiden, die in der string-algorithmen für die Verwaltung), sondern es bewegte sich, um UTF-16 unterstützen die code-Punkte, die außerhalb der BMP, Beibehaltung der gleichen code-Einheit Größe.
Keiner der Antworten, die auf eine Vorteil von UTF-16 über UTF-8 keinen Sinn, außer für die rückwärts-Kompatibilität zu Antworten.
Gut, es sind zwei Vorbehalte zu meinem Kommentar.
Erik sagt: "UTF-16-deckt die gesamte BMP mit einzelnen Einheiten - es sei denn, Sie haben ein Bedürfnis für die selteneren Zeichen außerhalb der BMP, UTF-16 ist effektiv 2 bytes pro Zeichen."
Caveat 1)
Wenn Sie sicher sein können, dass Ihre Anwendung müssen NIE irgendein Zeichen außerhalb der BMP, und dass jede Bibliothek von code, den Sie schreiben, für die Verwendung mit wird er NIE verwendet, mit jeder Anwendung, die jemals brauchen werden, ein Zeichen außerhalb der BMP, dann könnte man die Verwendung von UTF-16, und schreiben Sie code, der macht die implizite Annahme, dass jedes Zeichen genau zwei Byte lang.
Scheint äußerst gefährlich (eigentlich dumm).
Wenn Ihr code wird davon ausgegangen, dass alle UTF-16-Zeichen werden zwei bytes in der Länge, und Ihr Programm interagiert mit einer Anwendung oder Bibliothek, wo es ein einzelnes Zeichen außerhalb der BMP, dann ist dein code zu brechen. Code, der untersucht oder manipuliert UTF-16 geschrieben werden müssen, zu behandeln, die bei einer UTF-16-Zeichen, die mehr als 2 Byte, also bin ich "entlassen" diesem VORBEHALT.
UTF-16 ist nicht einfacher code als UTF-8 (der code für beide behandeln müssen variable-Länge-Zeichen).
VORBEHALT 2)
UTF-16 sein KÖNNTE, rechnerisch effizient, unter gewissen Umständen, wenn passend geschrieben.
Wie diese: nehmen wir an, dass bestimmte lange strings werden nur selten verändert, aber oft untersucht (oder besser, nie geändert, einmal gebaut - d.h. eine Zeichenkette-builder erstellen unveränderliche strings). Ein flag kann gesetzt werden für jeden string, der angibt, ob der string enthält nur "Feste Länge" Zeichen (d.h., keine Zeichen enthält, die nicht genau zwei bytes in der Länge). Strings, für die das flag true ist, könnte untersucht werden, mit optimierten code, der meint mit fester Länge (2 byte) Zeichen.
Wie etwa Raum-Effizienz?
UTF-16 ist natürlich effizienter, wenn Ein Zeichen), für die UTF-16 benötigt weniger bytes zu Kodieren als UTF-8.
UTF-8 ist, natürlich, effizienter für B) Zeichen für die UTF-8 benötigt weniger bytes zu Kodieren als UTF-16.
Außer für sehr "spezielle" text, es ist wahrscheinlich, dass count(B) wesentlich größer als count(A).
UTF-16-deckt die gesamte BMP mit einzelnen Einheiten - es sei denn, Sie haben ein Bedürfnis für die selteneren Zeichen außerhalb der BMP, UTF-16 ist effektiv 2 bytes pro Zeichen. UTF-32 mehr Platz in Anspruch nimmt, wird UTF-8 benötigt mit variabler Länge zu unterstützen.
UTF16 ist allgemein verwendet, da eine direkte Zuordnung zu multi-byte character sets, ie nur die original-0-0xFFFF Zeichen zugeordnet.
So erhalten Sie das beste aus beiden Welten, Sie haben einen festen Charakter, Größe, können aber weiterhin drucken alle Zeichen, die jemand wahrscheinlich (orthodoxe Klingonen religiöse Skripte ausgenommen)
UTF-16 erlaubt es, alle der basic multilingual plane (BMP) werden dargestellt, die einzelnen code-Einheiten. Unicode-code-points über U+FFFF, sind vertreten durch Surrogat-Paaren.
Das interessante an der Sache ist, dass Java und Windows (und andere Systeme, die UTF-16) arbeiten alle auf der code-unit-Ebene, nicht den Unicode-code-point der Ebene. Also die Zeichenfolge, die aus den einzelnen Zeichen U+1D122 (MUSICAL SYMBOL F-SCHLÜSSEL) wird codiert in Java als "\ud824\udd22" und
"\ud824\udd22".length() == 2
(nicht1
). Es ist also sozusagen ein hack, aber es stellt sich heraus, dass Zeichen nicht-variable-Länge.Den Vorteil von UTF-16 über UTF-8 ist, dass man aufgeben würde, zu viel, wenn Sie den gleichen hack benutzt wurden, mit UTF-8.