Consola Java, UTF-8 y Windows

Intentamos usar Java y UTF-8 en Windows. La aplicación escribe registros en la consola, y nos gustaría usar UTF-8 para los registros ya que nuestra aplicación tiene registros internacionalizados.

Es posible configurar la JVM para que genere UTF-8, utilizando -Dfile.encoding=UTF-8 como argumentos para la JVM. Funciona bien, pero la salida en una consola de Windows está distorsionada.

Entonces, podemos configurar la página de códigos de la consola en 65001 ( chcp 65001 ), pero en este caso, los archivos .bat no funcionan. Esto significa que cuando intentamos iniciar nuestra aplicación a través de nuestro script (llamado start.bat), no ocurre absolutamente nada. El comando simple devuelve:

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

Pero sin chcp 65001 , no hay ningún problema, y ​​la aplicación se puede iniciar.

¿Alguna pista sobre eso?

Pruebe chcp 65001 && start.bat

Java en Windows NO es compatible con la salida de Unicode de forma predeterminada. He escrito un método alternativo llamando a la API nativa con la biblioteca JNA. El método llamará a WriteConsoleW para la salida de Unicode en la consola.

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

Tuvimos algunos problemas similares en Linux. Nuestro código estaba en ISO-8859-1 (principalmente compatible con cp-1252) pero la consola era UTF-8, lo que hacía que el código no se comstackra. Simplemente cambiar la consola a ISO-8859-1 haría que la secuencia de comandos de construcción, en UTF-8, se rompa. Encontramos un par de opciones:
1- define alguna encoding estándar y adhesiva a ella. Esa fue nuestra elección. Elegimos mantener todo en ISO-8859-1, modificando los scripts de comstackción.
2- Establecer la encoding antes de comenzar cualquier tarea, incluso dentro de los scripts de comstackción. Cierto código como el erickson dijo. En Linux era como:

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

Mi eclipse sigue siendo así. Ambos funcionan bien.

¿Has probado PowerShell en lugar de viejo cmd.exe.