In welcher Codierung ist ein Java-Zeichen gespeichert?

7

Wird der Java-Zeichentyp garantiert in einer bestimmten Codierung gespeichert?

Bearbeiten: Ich habe diese Frage falsch formuliert. Was ich fragen wollte, ist Zeichenlabellen, die garantiert eine bestimmte Codierung verwenden?

    
pepsi 11.08.2011, 00:23
quelle

3 Antworten

13

"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.

    
Ryan Stewart 11.08.2011, 00:25
quelle
4

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 .

    
Stephen C 11.08.2011 01:06
quelle
2

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.

    
Ernest Friedman-Hill 11.08.2011 00:26
quelle