"Gespeichert" wo? Alle Strings in Java sind in UTF-16 dargestellt. Beim Schreiben in eine Datei, die über ein Netzwerk gesendet wird oder was auch immer, wird sie mit der von Ihnen angegebenen Zeichencodierung gesendet.
Bearbeiten: Spezifisch für den char
-Typ siehe Zeichendokumente . Insbesondere: "Der char-Datentyp ... basiert auf der ursprünglichen Unicode-Spezifikation, die Zeichen als 16-Bit-Elemente mit fester Breite definierte." Wenn Sie also char
an int
übergeben, erhalten Sie immer einen UTF-16-Wert , wenn das char
tatsächlich ein Zeichen aus diesem Zeichensatz enthält. Wenn Sie nur einen zufälligen Wert in char
eingegeben haben, ist es offensichtlich nicht unbedingt ein gültiges UTF-16-Zeichen, und ebenso, wenn Sie das Zeichen mit einer schlechten Kodierung lesen. In den Dokumenten wird diskutiert, wie die zusätzlichen UTF-16-Zeichen nur durch int
dargestellt werden können, da char
nicht genug Platz zum Speichern hat und wenn Sie auf dieser Ebene arbeiten, könnte es sein wichtig, um sich mit diesen Semantiken vertraut zu machen.
Ein Java char
wird üblicherweise verwendet, um einen Unicode-Code zu speichern Einheit ; eine 16-Bit-Einheit, die Teil einer gültigen UTF-16-Sequenz ist. Es gibt jedoch nichts, was eine Anwendung daran hindert, einen 16-Bit-Wert ohne Vorzeichen in eine char
zu setzen, unabhängig davon, was sie eigentlich bedeutet.
Man könnte also sagen, dass eine Unicode-Code-Einheit durch eine char
repräsentiert werden kann und eine char
kann eine Unicode-Code-Einheit darstellen ... aber auch nicht von diesen ist notwendigerweise wahr, im allgemeinen Fall.
Ihre Frage, wie ein Java char
gespeichert ist, kann nicht beantwortet werden. Einfach gesagt, es hängt davon ab, was Sie mit "gespeichert" meinen:
Wenn Sie "in einem ausführenden Programm vertreten" meinen, ist die Antwort JVM-spezifisch. (Der char
-Datentyp wird normalerweise als 16-Bit-Maschinen-Ganzzahl dargestellt, obwohl er abhängig vom jeweiligen Kontext möglicherweise maschinenwortorientiert ist.)
Wenn Sie "in einer Datei gespeichert" oder etwas Ähnliches meinen, dann ist die Antwort völlig abhängig davon, wie die Anwendung es speichert.
Wird der Java-Zeichentyp garantiert in einer bestimmten Codierung gespeichert?
Angesichts dessen, was ich oben gesagt habe, lautet die Antwort "Nein". In einer ausführenden Anwendung muss die Anwendung entscheiden, was ein char
bedeutet / enthält. Wenn ein char
in einer Datei gespeichert wird, entscheidet die Anwendung, wie sie es speichern möchte und welche Darstellung auf der Festplatte es verwenden wird.
FOLLOWUP
Was ist mit Char-Literalen? Zum Beispiel muss 'c' einen Wert haben, der durch die Sprache definiert ist.
Es hängt von der Buchstabenform ab und davon, was der Charakter ist. Zum Beispiel wird 'c' den Wert der unteren 16 Bits des Unicode-Codepunkts für Kleinbuchstaben 'c' haben. Ein Literal, das als '\ uxxxx' ausgedrückt wird, kann jedoch keinen gültigen Unicode-Codepunkt darstellen. Oder (abhängig davon, dass die Anwendung bedeutet) kann es überhaupt kein Zeichen darstellen.
Dies wird auch (möglicherweise) durch die Kodierung der Quellcodedatei kompliziert. Theoretisch ist es möglich, den Quellcode in einer benutzerdefinierten Zeichenkodierung darzustellen, in der (Groß- und Kleinschreibung) Großbuchstaben als Kleinbuchstaben codiert sind und umgekehrt. Wenn Sie dies getan haben und den entsprechenden Charset-Codierer und -Dekoder vor dem Starten des Compilers registrieren konnten, würde ein Literal, das wie 'c'
aussieht (die Eingabe als ASCII oder UTF-8 anzeigen), tatsächlich den Wert 67
haben. im Compiler-Programm statt 99
.
Zumindest denke ich das ...
Und hier ist ein weiterer Randfall:
%Vor%repräsentiert einen String, der zwei Code-Einheiten und einen Code-Punkt enthält, aber
%Vor% ist (oder sollte) illegal sein ... obwohl der Parser einen Codepunkt sieht, passt dieser Codepunkt nicht in ein char
.
Ursprünglich verwendete Java intern UCS-2; Jetzt verwendet es UTF-16. Die beiden sind praktisch identisch, mit Ausnahme von D800 - DFFF, die in UTF-16 als Teil der erweiterten Darstellung für größere Zeichen verwendet werden.
Tags und Links java character-encoding unicode