Question

Nous essayons d'utiliser Java et UTF-8 sur Windows.L'application écrit les journaux sur la console, et nous aimerions utiliser UTF-8 pour les journaux que notre application a internationalisé journaux.

Il est possible de configurer la JVM de sorte qu'il génère de l'UTF-8, à l'aide de -Dfile.encoding=UTF-8 comme arguments à la JVM.Il fonctionne très bien, mais la sortie sur une console Windows est déformé.

Ensuite, nous pouvons définir la page de code de la console pour 65001 (chcp 65001), mais dans ce cas, l' .bat les fichiers ne fonctionnent pas.Cela signifie que lorsque nous essayons de lancer notre application grâce à notre script (nommée start.chauve-souris), absolument rien ne se passe.La commande retour facile:

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

C:\Application>

Mais sans chcp 65001, il n'y a pas de problème, et l'application peut être lancée.

Toute allusion à ce sujet?

Était-ce utile?

La solution

Essayez chcp 65001 && start.bat

Autres conseils

Java sur windows ne prend PAS en charge unicode de sortie par défaut.J'ai écrit une solution par la méthode de l'appel API Native avec la JNA de la bibliothèque.La méthode d'appel WriteConsoleW pour unicode sortie sur la 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);
        }
    }
}

Nous avons eu quelques problèmes similaires dans Linux.Notre code était en ISO-8859-1 (pour la plupart cp-1252 compatible), mais la console était en UTF-8, rendant le code compile pas.Il suffit de changer de console à la norme ISO-8859-1 permettrait de rendre le script de construction, en UTF-8, à la pause.Nous avons trouvé un couple de choix:
1 - définir une norme de codage et collant à elle.C'était notre choix.Nous avons choisi de maintenir tous en ISO-8859-1, en modifiant les scripts de construction.
2 - Paramétrage de l'encodage avant de commencer n'importe quelle tâche, même à l'intérieur des scripts de compilation.Un code semblable à la erickson a dit.Dans Linux était comme :

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

Mon eclipse est toujours comme ça.Les deux marchent bien.

Avez-vous essayé PowerShell plutôt que de vieux cmd.exe.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top