Warum verwendet Java UTF-16 für die Darstellung interner Zeichenfolgen?

29

Ich könnte mir vorstellen, dass der Grund dafür schnell war, der Array-ähnliche Zugriff auf die Zeichen am Index, aber einige Zeichen passen nicht in 16 Bit, also würde es nicht funktionieren ...

Wenn Sie also trotzdem spezielle Fälle behandeln müssen, warum nicht einfach UTF-8 verwenden?

mrpyo
quelle
4
Eine Frage an die Java-Designer, nicht an die Community im Allgemeinen. Abstimmung als nicht konstruktiv zu schließen.
Oded
16
@Oded: absolut ungerechtfertigt, wie die Antwort von DeadMG zeigt.
Michael Borgwardt
Ich bin verwirrt: Ich war mir ziemlich sicher, dass diese Frage bereits beantwortet wurde (sowohl hier als auch auf SO), aber ich kann das Duplikat (die Duplikate) nicht finden.
Joachim Sauer
Für hysterische Rosinen. Siehe utf8everywhere.org
Pavel Radzivilovsky

Antworten:

47

Weil es früher UCS-2 war , was eine schöne 16-Bit-Version mit fester Länge war. Natürlich hat sich herausgestellt, dass 16bit nicht genug ist. Sie haben UTF-16 nachgerüstet.

DeadMG
quelle
6
Hier ist ein Zitat aus der Unicode-FAQ : Originally, Unicode was designed as a pure 16-bit encoding, aimed at representing all modern scripts. (Ancient scripts were to be represented with private-use characters.) Over time, and especially after the addition of over 14,500 composite characters for compatibility with legacy sets, it became clear that 16-bits were not sufficient for the user community. Out of this arose UTF-16.Zum Zeitpunkt der Java-Veröffentlichung war UTF-16 noch nicht erschienen und UTF-8 war kein Teil des Unicode-Standards.
Malcolm,
20
UCS-2 ist ein Fachbegriff, kein Schlagwort.
DeadMG
14

Zum großen Teil, um einfach und zukunftssicher zu sein. Ob es ein irrtümlicher Grund und der falsche Weg war, ist eine andere Frage.

In diesem Dokument werden einige Gründe für einige ihrer Entwurfsentscheidungen bezüglich der Umstellung auf Java 5 und UTF-16 aufgeführt. Dies erklärt auch einige der Mängel: Ergänzende Zeichen auf der Java-Plattform und die Gründe für die Verwendung des Java-Ökosystems verschiedene Kodierungen in ihrem Stapel? .

Weitere Informationen zu den Gefahren der Verwendung von UTF-16 und warum UTF-8 im Allgemeinen wahrscheinlich die bessere Option ist, finden Sie unter Sollte UTF-16 als schädlich eingestuft werden? und das UTF-8 Everywhere- Manifest.

Haylem
quelle
8
+1 für die Verknüpfung mit "Sollte UTF-16 als schädlich eingestuft werden?" Frage. Ich habe kürzlich das UTF-8 Everywhere-Manifest entdeckt und bin jetzt ziemlich überzeugt. Für das, was es wert ist, obwohl Java es falsch verstanden hat, bin ich ziemlich überzeugt, dass Windows viel viel schlimmer gemacht hat.
Daniel Pryden
5
Nun, es ist keine Überraschung, dass Windows mehr falsch verstanden hat : Sie haben früher zu Unicode gewechselt, so dass sie weniger richtige Entscheidungen und weniger Erfahrung hatten. Java wurde später, es wurde mehr richtig , aber immer noch etwas falsch. Jetzt müssen beide mit alten, allgemein falschen APIs leben, die sie weiterhin unterstützen müssen.
Joachim Sauer
4
Das ist das Leben in der Software-Welt. Man muss Entscheidungen treffen, ohne alle Daten zu haben, und wenn man sich irrt, muss man lange mit den Konsequenzen leben. :-)
Brian Knoblauch
2
Ich frage mich, was die Auswirkungen auf die Leistung gehabt hätten, wenn stringein "spezieller" Typ in Java erstellt worden wäre (ähnlich wie in Java Array), anstatt Stringeine "gewöhnliche" Klasse zu sein, die einen Verweis auf ein "gewöhnliches" Array enthält, das die tatsächlichen Zeichen enthält. Abhängig davon, wie eine Zeichenfolge generiert wird, ist UTF-8, UTF-16 oder sogar UTF-32 die effizienteste Methode zum Speichern dieser Zeichenfolge. Ich denke, es gibt keine besonders effiziente Möglichkeit für eine "normale" Klasse String, mehrere Formate zu verarbeiten, aber ein "spezieller" Typ mit JVM-Unterstützung könnte dies.
Supercat
@supercat: Ich habe keine genaue Antwort darauf, aber ich habe eine verwandte SO Antwort dafür. :) Befasst sich nicht wirklich mit dem speziellen Typansatz, sondern erörtert den potenziellen Gewinn, wenn Zeichenfolgen optimiert werden.
Haylem