Von der Kompilation zur Laufzeit wie funktioniert die Java-String-Codierung wirklich funktionieren

Ich realisierte, dass ich nicht vollständig verstehen, Java-string-Kodierung.

Betrachten Sie den folgenden code:

public class Main
{
    public static void main(String[] args)
    {
        System.out.println(java.nio.charset.Charset.defaultCharset().name());
        System.out.println("ack char: ^"); /* where ^ = 0x06, the ack char */
    }
}

Da die control-Zeichen sind anders interpretiert, die zwischen windows-1252 und ISO-8859-1, wählte ich die ack char zum testen.

Ich jetzt kompilieren Sie es mit unterschiedlichen Dateitypen, Kodierungen, UTF-8, windows-1252, und ISO-8859-1. Die beiden zusammenzustellen, die genau die gleiche Sache, byte-per-byte als verified by md5sum.

Ich dann das Programm ausführen:

$ java Main | hexdump -C
00000000  55 54 46 2d 38 0a 61 63  6b 20 63 68 61 72 3a 20  |UTF-8.ack char: |
00000010  06 0a                                             |..|
00000012

$ java -Dfile.encoding=iso-8859-1 Main | hexdump -C
00000000  49 53 4f 2d 38 38 35 39  2d 31 0a 61 63 6b 20 63  |ISO-8859-1.ack c|
00000010  68 61 72 3a 20 06 0a                              |har: ..|
00000017

$ java -Dfile.encoding=windows-1252 Main | hexdump -C
00000000  77 69 6e 64 6f 77 73 2d  31 32 35 32 0a 61 63 6b  |windows-1252.ack|
00000010  20 63 68 61 72 3a 20 06  0a                       | char: ..|
00000019

It-Ausgaben korrekt den 0x06 egal, welche Kodierung verwendet wird.

Ok, es sind noch Ausgänge die gleiche 0x06, der würde interpretiert werden als der druckbare [ACK] char von windows-codepages 1252.

Führt mich zu ein paar Fragen:

  1. Ist die codepage /Zeichensatz der Java-Datei kompiliert wird voraussichtlich identisch sein mit dem default-charset des Systems, unter denen es zusammengestellt? Sind die beiden immer gleichbedeutend?
  2. Die kompilierte Repräsentation scheint nicht abhängig vom compile-Zeit-Zeichensatz, ist dies tatsächlich der Fall ist?
  3. Bedeutet dies, dass Zeichenfolgen innerhalb von Java-Dateien möglicherweise anders interpretiert zur Laufzeit, wenn Sie nicht verwenden standard-Zeichen für den aktuellen charset/locale?
  4. Was sollte ich wirklich wissen, über die string-und character-encoding in Java?
  • Es ist nicht klar, was du meinst mit "kompilieren Sie es mit anderen Datei-Codierungen". Meinst du, dass Sie speichern Sie die Datei in verschiedenen Kodierungen, kompilieren Sie dann jeweils die Dateien mit dem -Codierung Schalter zu javac? Wenn ja, wie tun Sie wissen, was random Müll ist die Abwicklung in der Quell-Dateien nach dem speichern Sie in diesen Codierungen? Sie können nicht ein literal-Steuerelement Zeichen Sie in Ihre Quelle und erwarten, dass es, um zu überleben-Serialisierung in kodierte Zeichen.
  • Eine Datei ist nichts anderes als ein Strom von bytes. Diese bytes werden unterschiedlich interpretiert, abhängig von der Zeichencodierung, Sie sind davon ausgegangen, dass in. So, ich bin auf Saiten, die enthalten chars, die möglicherweise unterschiedlich interpretiert werden, entweder zur Laufzeit oder zur Compilezeit, durch die Annahme der Datei kodiert wurde in verschiedenen Zeichen-sets.
  • Explizit über die Zusammenstellung Schritt, die ich verwendet, Sonne encoding-Eigenschaft legen Sie den Zeichensatz bei der Kompilierung: javac -encoding windows-1252 Main.java, die mit der Kodierung entsprechend gesetzt.
Schreibe einen Kommentar