In welcher Codierung ist eine Java-char gespeichert?
Ist die Java char-Typ garantiert werden gespeichert in einer bestimmten Codierung?
Edit: ich formulierte diese Frage falsch. Was ich gemeint habe zu Fragen, ist sind char-Literale garantiert verwenden keine bestimmten Codierung?
- kurze Antwort auf deine Frage, ist Nein, es ist nicht garantiert
- Ja, ist es. Die interne Darstellung ist Recht gut definiert.
- Nein, es ist nicht. Viele der standard-Java-Bibliothek Klassen sind entworfen, um die Arbeit auf der Annahme, dass ein
char
enthält eine Unicode-code-Einheit, sondern die Anwendung kann im Grunde genommen jeder 16-bit-unsigned-integer-Wert in einechar
. Der Wert ist nicht erforderlich, die codiert werden in einer bestimmten Art und Weise. Es braucht auch nicht vertreten, eine komplette (oder teilweise) mit "Charakter". - Was ist mit char-literalen? Für Beispiel, 'c' muss einen gewissen Wert, der definiert ist durch die Sprache.
Du musst angemeldet sein, um einen Kommentar abzugeben.
"Gespeichert" wo? Alle Strings in Java sind dargestellt in UTF-16. Wenn in eine Datei geschrieben, über ein Netzwerk gesendet oder was auch immer, es ist geschickt mit einer beliebigen Zeichenkodierung, die Sie angeben.
Edit: Speziell für die
char
geben, finden Sie unter der Charakter docs. Konkret: "Der Datentyp char ... basiert auf der ursprünglichen Unicode-Spezifikation, die definiert Zeichen als die Feste Breite von 16-bit Einheiten." Daher, castingchar
zuint
wird Ihnen immer die UTF-16-Wert wenn diechar
enthält tatsächlich ein Zeichen aus diesem Zeichensatz. Wenn Sie nur nahm einige zufällige Wert in derchar
es wird offensichtlich nicht unbedingt ein gültiges UTF-16-Zeichen, und ebenfalls, wenn Sie Lesen, den Charakter mit einem schlechten Codierung. Die docs gehen, um zu diskutieren, wie die Ergänzende UTF-16-Zeichen können nur dargestellt werden, indem eineint
, dachar
nicht genügend Platz, um Sie zu halten, und wenn Sie in Betrieb sind auf dieser Ebene, es könnte wichtig sein, um sich mit diese Semantik.Java
char
wird herkömmlich verwendet, um eine Unicode-code-Einheit; d.h. ein 16-bit-Einheit, die Teil eines gültiges UTF-16-Sequenz. Jedoch, es gibt nichts zu verhindern, dass eine Anwendung von putting eine beliebige 16-bit-Wert ohne Vorzeichen in einechar
, unabhängig davon, was es eigentlich bedeutet.Könnte man also sagen, dass ein Unicode-code-Einheit werden kann vertreten durch eine
char
und einchar
kann stellen eine Unicode-code-Einheit ... aber keiner von diesen ist unbedingt wahr ist, im Allgemeinen Fall.Ihre Frage, wie ein Java -
char
gespeichert ist, kann nicht beantwortet werden. Einfach gesagt, es hängt davon ab, was du damit meinst "gespeichert":Wenn du meinst "vertreten, die in einem Programm ausführen", dann ist die Antwort JVM Implementierung spezifischer. (Die
char
Datentyp ist in der Regel dargestellt als eine 16-bit-Computer integer, aber es kann oder kann nicht in der Maschine word ausgerichtet, je nach den spezifischen Kontext.)Wenn du meinst ", gespeichert in einer Datei" oder so ähnlich, dann ist die Antwort völlig abhängig auf, wie die Anwendung wählt, um es zu speichern.
Im Lichte dessen, was ich oben sagte, die Antwort ist "Nein". In einer ausgeführten Anwendung, es ist an der Anwendung, zu entscheiden, was ein
char
bedeutet /beinhaltet. Wenn einchar
eine Datei gespeichert, die Anwendung entscheidet, wie es will, um es zu speichern und das, was auf der Festplatte Darstellung benutzt wird.FOLLOWUP
Kommt es auf den Charakter wörtlichen form, und was das Zeichen ist. Zum Beispiel, 'c' wird der Wert der die unteren 16 bits der Unicode-codepoint für Kleinbuchstaben "c". Aber ein literal ausgedrückt als '\uxxxx' kann vertreten nicht eine gültige Unicode-codepoint. Oder (je nach der Anwendung) kann es nicht darstellen, ein Zeichen an alle.
Dies ist auch (potenziell) kompliziert durch die Codierung der source-code-Datei. Es ist theoretisch möglich, stellen Sie Ihre source-code in einem benutzerdefinierten Zeichencodierung, in der (aus Gründen der argument) Großbuchstaben codiert sind als Kleinbuchstaben, und Umgekehrt. Wenn Sie dies getan haben, und Sie waren in der Lage, sich die entsprechenden Charset encoder und decoder vor dem Start der compiler, dann wird ein literal, das sieht aus wie
'c'
(die Anzeige, die Eingabe als ASCII-oder UTF-8) eigentlich müsste der Wert67
in den compiler-Programm eher als99
.char
ist 16 bit, ist stellen ein utf-16 code point nicht sicher, ob ein utf-16-code-unit, weil uft-16-code-unit besteht vielleicht aus 2 code-Punkt, in diesem Fall müssen 2char
zu stellen eine echte char.Ursprünglich Java benutzt UCS-2, intern; jetzt verwendet UTF-16. Die beiden sind praktisch identisch, außer für die D800 - DFFF, die in UTF-16 als Teil der erweiterten Darstellung für größere Zeichen.