Wie funktioniert Java speichern von UTF-16-Zeichen in seiner 16-bit-char-Typ?
Entsprechend der Java SE 7 Spezifikation, Java verwendet den Unicode UTF-16-standard zur Darstellung von Zeichen.
Wenn sich eine String
als einfaches array 16-bit-Variablen mit je einer Figur, das Leben ist einfach.
Leider gibt es code, der Punkte, für die 16 bit sind einfach nicht genug (ich glaube es war 16/17 alle Unicode-Zeichen). Also in einem String
stellt dies kein direktes problem, weil, wenn Sie wollen, um zu speichern eine dieser ~1.048.576 Zeichen mit einem zwei zusätzliche bytes, einfach zwei array-Positionen, die String
verwendet werden würde.
Diese, ohne dass irgendwelche direkte problem, funktioniert für String
s, denn es kann immer eine zusätzliche zwei bytes. Aber wenn es um einzelne Variablen, die im Gegensatz zu UTF-16-Codierung ein festen Länge von 16 bits, wie kann man diese Zeichen gespeichert werden, und insbesondere, wie funktioniert Java es mit seinen 2-byte - "char" - Typ?
- Bitte missbrauchen Sie nicht die backticks. Sie sind für nur code.
- Es nicht.. Wenn es speichern könnte, wie viel ein Punkt, Sie es nennen würde, 'Zeichen' 🙂 String[index] kann ein ungültiges Zeichen. Weitere Informationen erhalten Sie im utf8everywhere.org.
- Naja, ich habe immer verwendet Sie einfach, um zu betonen oder unterstreichen Wörter oder Sätze, schien die meisten wichtig oder hatte einen hohen Wiedererkennungswert. Aber vielen Dank für die Einstellung mich Recht, ich werde versuchen, achtsamer in der Zukunft.
- Sie können Kursiv-und Fettdruck für die normalen und außergewöhnlichen Wert. Das sollte ausreichend sein für die meisten SO Beiträge! 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Antwort ist in in der javadoc :
Einfach gesagt :
Sogar noch einfacher gesagt :
Nebenbei, es kann angemerkt werden, dass die Entwicklung von Unicode zu erweitern, vorbei an der BMP gemacht UTF-16 Global irrelevant, dass jetzt UTF-16 nicht auch ermöglichen eine Feste byte-chars-Verhältnis. Das ist, warum mehr in den modernen Sprachen basieren auf UTF-8. Diese Manifest hilft, es zu verstehen.
int ch
speichert, die zusätzliche Zeichen, wie Speichere ich das als Teil der Zeichenfolge?write(int ch)
können verwendet werden, um zu schreiben, dass Charakter zu einem anderen externen Quelle.Grundsätzlich strings speichern einer Sequenz von UTF-16 code-Einheiten... das ist nicht das gleiche wie das speichern einer Sequenz von Unicode-Codepunkten.
Wenn ein Zeichen außerhalb der Basic Multilingual Plane erforderlich ist, das dauert bis zwei UTF-16-code-units innerhalb der
String
.Meisten
String
Operationen -length()
,charAt
,substring()
etc Angebot in zahlen von UTF-16 code-Einheiten. Es gibt jedoch Operationen, wiecodePointAt()
, die sich mit voller Unicode-code-points... obwohl die Indizes sind noch ausgedrückt in der UTF-16-code-units.EDIT: Wenn Sie speichern wollen, ein nicht-BMP-Codepunkt in einen einzigen
char
Sie sind im Grunde genommen Pech. Es ist wie zu wollen, speichern Sie mehr als 256 verschiedene Werte in einerbyte
variable... es funktioniert einfach nicht. Folgende Konventionen für die Darstellung eines code-point an anderer Stelle (z.B. inString
) es ist am besten verwenden Sie einfach einenint
variable.char
s anstelle von string-Operationen (cf. letzter Satz der Frage).