Domanda

Cerchiamo di usare Java e UTF-8 su Windows.L'applicazione scrive log della console, e vorremmo utilizzare la codifica UTF-8 per i log come la nostra applicazione ha internazionalizzato registri.

È possibile configurare la JVM in modo che genera UTF-8, -Dfile.encoding=UTF-8 come argomenti per la JVM.Funziona bene, ma l'uscita su una console di Windows è distorta.

Quindi, siamo in grado di impostare il codice di pagina della console per 65001 (chcp 65001), ma in questo caso, il .bat i file non funzionano.Questo significa che quando si tenta di avviare la nostra applicazione tramite il nostro script (denominato start.bat), assolutamente non accade nulla.Il comando semplice restituisce:

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

C:\Application>

Ma senza chcp 65001, non c'è alcun problema, e l'applicazione può essere avviata.

Eventuali suggerimenti in merito?

È stato utile?

Soluzione

Provare chcp 65001 && start.bat

Altri suggerimenti

Java su windows NON supporta unicode uscita per impostazione predefinita.Ho scritto un metodo per risolvere il problema chiamando l'API Nativa con JNA biblioteca.Il metodo di chiamata WriteConsoleW per unicode uscita su console.

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);
        }
    }
}

Abbiamo avuto dei problemi simili a Linux.Il nostro codice è in ISO-8859-1 (principalmente cp-1252 compatibile), ma la console è UTF-8, rendendo il codice non compila.Semplicemente cambiando la console ISO-8859-1 sarebbe uno script di build, in UTF-8, per rompere.Abbiamo trovato un paio di scelte:
1 - definire alcuni standard di codifica e appiccicoso ad esso.Che è stata la nostra scelta.Abbiamo scelto di mantenere il tutto in ISO-8859-1, la modifica, la creazione di script.
2 - Impostazione della codifica prima di iniziare qualsiasi attività, anche all'interno degli script.Un po ' di codice come ha detto erickson.In Linux è stato come :

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

Il mio eclipse è ancora come questo.Entrambi funzionano bene.

Hai provato PowerShell piuttosto che le vecchie cmd.exe.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top