Frage

Wir versuchen, Java und UTF-8 unter Windows zu verwenden.Die Anwendung schreibt Protokolle auf der Konsole und wir möchten UTF-8 für die Protokolle verwenden, da unsere Anwendung über internationalisierte Protokolle verfügt.

Es ist möglich, die JVM so zu konfigurieren, dass sie UTF-8 generiert -Dfile.encoding=UTF-8 als Argumente für die JVM.Es funktioniert einwandfrei, aber die Ausgabe auf einer Windows-Konsole ist verstümmelt.

Dann können wir die Codepage der Konsole auf 65001 (chcp 65001), aber in diesem Fall die .bat Dateien funktionieren nicht.Das bedeutet, dass absolut nichts passiert, wenn wir versuchen, unsere Anwendung über unser Skript (mit dem Namen start.bat) zu starten.Der einfache Befehl gibt Folgendes zurück:

C:\Application> chcp 65001
Activated code page: 65001
C:\Application> start.bat

C:\Application>

Aber ohne chcp 65001, es gibt kein Problem und die Anwendung kann gestartet werden.

Irgendwelche Hinweise dazu?

War es hilfreich?

Lösung

Versuchen chcp 65001 && start.bat

Andere Tipps

Java auf Windows Unicode ouput standardmäßig nicht unterstützt. Ich habe eine Abhilfe Methode geschrieben von Native API mit JNA Bibliothek.Das Aufruf der Methode wird WriteConsoleW für Unicode-Ausgabe auf der Konsole aufrufen.

import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.ptr.IntByReference;
import com.sun.jna.win32.StdCallLibrary;

/** For unicode output on windows platform
 * @author Sandy_Yin
 * 
 */
public class Console {
    private static Kernel32 INSTANCE = null;

    public interface Kernel32 extends StdCallLibrary {
        public Pointer GetStdHandle(int nStdHandle);

        public boolean WriteConsoleW(Pointer hConsoleOutput, char[] lpBuffer,
                int nNumberOfCharsToWrite,
                IntByReference lpNumberOfCharsWritten, Pointer lpReserved);
    }

    static {
        String os = System.getProperty("os.name").toLowerCase();
        if (os.startsWith("win")) {
            INSTANCE = (Kernel32) Native
                    .loadLibrary("kernel32", Kernel32.class);
        }
    }

    public static void println(String message) {
        boolean successful = false;
        if (INSTANCE != null) {
            Pointer handle = INSTANCE.GetStdHandle(-11);
            char[] buffer = message.toCharArray();
            IntByReference lpNumberOfCharsWritten = new IntByReference();
            successful = INSTANCE.WriteConsoleW(handle, buffer, buffer.length,
                    lpNumberOfCharsWritten, null);
            if(successful){
                System.out.println();
            }
        }
        if (!successful) {
            System.out.println(message);
        }
    }
}

Wir hatten einige ähnliche Probleme in Linux. Unser Code war in ISO-8859-1 (meist cp-1252 kompatibel), aber die Konsole war UTF-8, den Code zu machen, um nicht zu kompilieren. Durch einfaches Ändern die Konsole auf ISO-8859-1 würde den Build-Skript, in UTF-8, brechen machen. Wir fanden ein paar Möglichkeiten:
1- einige Standard-Codierung und klebrig, um es zu definieren. Das war unsere Wahl. Wir wählen alle in ISO-8859-1 zu halten, um die Build-Skripte modifizieren.
2- Verschlüsselung einstellen, bevor sie eine Aufgabe starten, auch in dem Build-Skripte. Einige Code wie Erickson sagte. In Linux war wie:

lang=pt_BR.ISO-8859-1 /usr/local/xxxx

Meine Finsternis ist immer noch so. Beide funktionieren gut.

Haben Sie versucht, Powershell anstatt alte cmd.exe.

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