Java - was sind Zeichen, code-Punkte und Surrogate? Welchen Unterschied gibt es zwischen Ihnen?
Ich versuche zu finden, eine Erklärung der Begriffe "Zeichen", "code zeigen" und "Leihmutter", und während diese Begriffe nicht beschränkt auf Java, wenn es keine Sprache-spezifische Unterschiede würde ich gerne die Erklärung, wie es bezieht sich auf Java.
Ich habe festgestellt, dass einige Informationen über die Unterschiede zwischen Zeichen-und code-Punkte, Zeichen, was angezeigt wird, die für den menschlichen Benutzer und code-Punkte, wobei ein Wert-Codierung, die spezifische Charakter, aber ich habe keine Idee über Surrogate. Was sind Surrogate, und wie unterscheiden Sie sich von Zeichen-und code-Punkte? Habe ich die richtigen Definitionen für Zeichen und code Punkte?
In ein anderer thread über das Durchlaufen eines Strings als ein array von Zeichen, die bestimmten Kommentar, der dazu aufgefordert diese Frage war "Beachten Sie, dass diese Technik gibt Ihnen Zeichen, keine code-Punkte, das heißt, Sie können Holen Sie Surrogate." Ich habe nicht wirklich verstehen, und anstatt zu erstellen, die eine lange Reihe von Kommentaren, die auf einer 5-Jahr-alte Frage, die ich dachte, es wäre am besten, bitte um Aufklärung in einer neuen Frage stellen.
- Alle diese Antworten, die bisher Hinzugefügt haben, mehr zu meinem Verständnis der Begriffe, die in meiner Frage, so, während ich bin Kommissionierung eine "Antwort", ich denke, Sie alle haben mir geholfen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zur Darstellung von text in Rechnern, die Sie zu lösen haben, zwei Dinge: Erstens, Sie haben, um anzeigen von Symbolen zu zahlen, dann haben Sie zu vertreten, eine Reihenfolge der zahlen in bytes.
Einen Code zeigen ist eine Nummer, die zur Identifizierung ein symbol. Zwei bekannte standards für die Zuordnung von zahlen zu Symbolen sind ASCII und Unicode. ASCII definiert 128 Symbole. Unicode definiert derzeit 109384 Symbole, ist, dass viel mehr als 216.
Darüber hinaus ASCII-gibt an, dass die Anzahl der Sequenzen vertreten sind, ein byte pro Zahl, während Unicode gibt mehrere Möglichkeiten, wie UTF-8, UTF-16 und UTF-32.
Wenn Sie versuchen, verwenden Sie eine Verschlüsselung, die verwendet weniger bits pro Zeichen als nötig sind, um alle möglichen Werte (z.B. UTF-16 verwendet 16 bits), müssen Sie einige Abhilfe.
So, Surrogates sind 16-bit-Werte, die Symbole, die passen nicht in einer einzigen zwei-byte-Wert.
Java verwendet UTF-16.
Insbesondere eine
char
(Charakter) ist ein unsigned two-byte Wert, der enthält ein UTF-16-Wert.Wenn Sie mehr darüber erfahren möchten, Java und Unicode, kann ich nur empfehlen, diesen newsletter: Teil 1, Teil 2
Finden Sie eine kurze Erklärung in der Javadoc für die Klasse java.lang.Charakter:
In anderen Worten:
Einen code point in der Regel stellt ein einzelnes Charakter. Ursprünglich, die Werte des Typs
char
genau abgestimmt den Unicode-code-points. Diese Kodierung war auch bekannt als UCS-2.Deshalb
char
wurde definiert als eine 16-Bit-Typ. Allerdings gibt es derzeit mehr als 2^16 Zeichen in Unicode. Zur Unterstützung des gesamten Zeichensatz, die Codierung wurde geändert von fixed-length-Kodierung UCS-2 zu der variable-Länge-Kodierung UTF-16. Innerhalb dieser Codierung, jeder code-point ist vertreten durch einen einzigenchar
oder zweichar
s. Im letzteren Fall, die beiden chars sind genannt ersatzpaar.UTF-16 wurde so definiert, dass es keinen Unterschied zwischen text kodiert mit UTF-16 und UCS-2, wenn alle code-points sind unter 2^14. Das bedeutet,
char
verwendet werden können, darstellen, einige, aber nicht alle Zeichen. Wenn ein Charakter nicht dargestellt werden können in einem einzigenchar
der Begriffchar
ist irreführend, weil es nur als 16-Bit-Wort.Code Punkte in der Regel bezieht sich auf die Unicode-codepoints. Die Unicode-Glossar sagt:
In Java, ein Zeichen (
char
) ist eine vorzeichenlose 16-bit-Wert; ich.e 0 bis FFFF.Wie Sie sehen können, gibt es mehrere Unicode-codepoints dargestellt werden kann als Java-Zeichen. Und doch muss Java in der Lage sein, die zum darstellen von text unter Verwendung aller gültigen Unicode-codepoints.
Den Weg, dass Java sich mit diesem zu vertreten ist codepoints, die größer als FFFF als paar von Zeichen (code units), d.h. eine ersatzpaar. Diese Kodieren einen Unicode-codepoint größer als FFFF als ein paar von 16 bit-Werte. Dieser nutzt die Tatsache, dass ein Teilbereich des Unicode-code-space (z.B. D800 bis U+DFFF) ist reserviert für die Darstellung von Surrogat-Paaren. Die technischen details sind hier.
Die richtige Bezeichnung für die Kodierung, die Java verwenden, ist die UTF-16-Kodierung Bilden.
Einem anderen Begriff, den Sie vielleicht sehen, ist code-Einheit das ist die minimale gegenständliche Einheit, in der eine bestimmte Codierung. In UTF-16-code-unit sind 16 bit, das entspricht einer Java -
char
. Andere Kodierungen (z.B. UTF-8, ISO 8859-1, etc) haben die 8-bit-code-Einheiten, und UTF-32 ist ein 32-bit-code-Einheit.Den Begriff Zeichen hat viele Bedeutungen. Es bedeutet, dass alle möglichen Dinge in unterschiedlichen Kontexten. Die Unicode-Glossar gibt 4 Bedeutungen für Charakter wie folgt:
Und dann gibt es die Java-spezifische Bedeutung für den Charakter.
char
. 1) Nein. Das bezieht sich auf eine Natürliche Sprache. Und außerdem, Javachar
kleiner ist als die kleinste Komponente in einigen Fällen. 2) Keine. Gleichen Grund. Ein Java -char
ist zu klein, um zu repräsentieren, einen abstrakten Charakter haben, in einigen Fällen.char
ist eine code-Einheit ist, sondern ein code Punkt machen, benötigen Sie zwei Java -char
Werte.char
ist ein 16-bit-code-Einheit. Zeichen, die in der abstrakten Charakter Sinn werden unterstützt in Ihrem source-code (z.B. in String-literalen), aber nicht als first-class-Werte. Also String hat die "funky" - Methoden für die Behandlung der text als ein code point Sequenz ... mitint
geben Sie die codepoint-Werte. Wenn Sie das Scannen durch die Justiz, Freiheit und Sicherheit, Sie werden sehen, dass das Wort "Charakter" hat verschiedene Nuancen, je nach Kontext. Es gibt keine einzelne Bedeutung.Beginnen mit, unicode ist ein standard, der versucht zu definieren, und ordnen Sie die einzelnen Zeichen aus allen Sprachen, von Englisch Briefe auf Chinesisch, zahlen, Symbole etc.
Grundsätzlich unicode hat eine lange Liste von numerierten Zeichen, wo die code point bezieht sich auf die Nummerierung.
Kurz
UTF-16
encoding scheme Häuser, so viele Charaktere, die alle passen nicht in den vorgegebenen Raum des einzelnen ein java-Charakter.