Frage

Warum wird die folgende angezeigt verschiedene in Linux vs Windows-?

System.out.println(new String("¿".getBytes("UTF-8"), "UTF-8"));

in Windows:

¿

in Linux:

¿

War es hilfreich?

Lösung

System.out.println () gibt den Text im System Standard-Kodierung, aber die Konsole interpretiert, dass die Ausgabe nach seiner eigene Codierung (oder „Codepage“) -Einstellung. Auf Ihrem Windows-Rechner scheinen die beiden Codierungen zu passen, aber auf der Linux-Box ist der Ausgang offenbar in UTF-8, während die Konsole es als Single-Byte-Codierung wie ISO-8859-1 decodiert. Oder vielleicht, wie Jon vorgeschlagen, wird die Quelldatei gespeichert werden als UTF-8 und javac wird es als etwas anderes zu lesen, ein Problem, das durch Verwendung von Unicode entkommt vermieden werden kann.

Wenn Sie die Ausgabe etwas brauchen andere als ASCII-Text, Ihre beste Wette ist es in einer Datei unter Verwendung einer geeigneten Codierung zu schreiben, dann die Datei mit einem Texteditor lesen - Konsolen sind zu begrenzt und zu systemabhängig. By the way, dieses Stück Code:

new String("¿".getBytes("UTF-8"), "UTF-8")

... hat keine Auswirkung auf den Ausgang. Alles, was tut, ist den Inhalt der Zeichenfolge in einem Byte-Array kodieren und es wieder dekodieren, die ursprüngliche Zeichenfolge reproduzieren - einen teueren no-op. Wenn Sie in einer bestimmten Codierung Ausgangstext wollen, müssen Sie eine Output verwenden, etwa so:

FileOutputStream fos = new FileOutputStream("out.txt");
OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");

Andere Tipps

Nicht sicher, wo das Problem genau ist, aber es ist erwähnenswert, dass

¿ (0xc2,0xbf)

ist das Ergebnis der Codierung mit UTF-8

0xBF,

das ist der Unicode-Codepoint für ¿

So sieht es aus wie in dem Linux-Fall wird der Ausgang nicht als utf-8 angezeigt wird, sondern als eine Single-Byte-Zeichenfolge

Überprüfen Sie, was der Kodierung der Linux-Terminal hat.

Für gnome-terminal in ubuntu -. Gehen Sie zum Menü "Terminal" und wählen Sie "Zeichenkodierung"

Für Kitt, Konfiguration -> Fenster -> Übersetzung -> UTF-8 (und wenn das nicht funktioniert, finden Sie unter dieser Beitrag ).

Führen Sie diesen Code, um festzustellen, ob es ein Compiler oder Konsole Problem ist:

public static void main(String[] args) throws Exception {
    String s = "¿";
    printHex(Charset.defaultCharset(), s);

    Charset utf8 = Charset.forName("UTF-8");
    printHex(utf8, s);
}

public static void printHex(Charset encoding, String s)
        throws UnsupportedEncodingException {
    System.out.print(encoding + "\t" + s + "\t");

    byte[] barr = s.getBytes(encoding);
    for (int i = 0; i < barr.length; i++) {
        int n = barr[i] & 0xFF;
        String hex = Integer.toHexString(n);
        if (hex.length() == 1) {
            System.out.print('0');
        }
        System.out.print(hex);
    }
    System.out.println();
}

Wenn das codierte Bytes für UTF-8 auf jeder Plattform unterschiedlich ist (es sollte c2bf ), es ist eine Compiler Ausgabe.

Wenn es ein Compiler Problem ist, ersetzen Sie "¿" mit "\ u00bf" .

Es ist schwer, genau zu wissen, welche Ihr Quellcode-Bytes enthält, oder die Zeichenfolge, die getBytes () aufgerufen werden, aufgrund des Editor und Compiler-Codierungen.

Kann sich Ihnen eine kurze, aber vollständige Programm enthält nur ASCII (und die entsprechende \ uxxxx in der Zeichenfolge zu entkommen), die immer noch das Problem zeigt?

Ich vermute, dass das Problem auch mit der Ausgabe der Konsole auf Windows oder Linux sein, aber es wäre gut, zuerst ein reproduzierbares Programm zu erhalten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top