2008-09-10 28 views
10

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.Java, UTF-8 y consola de Windows

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

Luego, 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 devuelve simples:

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 puede ser lanzado.

¿Alguna pista sobre eso?

+0

¿Cuál es la codificación de texto del archivo start.bat? – johnstok

Respuesta

6

Trate chcp 65001 && start.bat

+0

Esto debe usarse junto con -Dfile.encoding = UTF-8 para que funcione correctamente. –

+0

@AxelFontaine Intenté usar -Dfile.encoding = UTF-8 pero al usar el símbolo de raíz cuadrada, los últimos 2 números después del símbolo se repetirían. E.g en lugar de '√125' la salida sería' √12525' – Cj1m

-4

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

+1

PowerShell todavía usa la misma consola, por lo que es tan viejo y tan sucio como cmd.exe. – Trejkaz

0

Hemos tenido 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 compilara. 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 codificación estándar y adhesiva. Esa fue nuestra elección. Elegimos mantener todo en ISO-8859-1, modificando los scripts de compilación.
2- Configurando la codificación antes de comenzar cualquier tarea, incluso dentro de los scripts de compilació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.

+0

Parece un paso atrás para pegarse (y modificar cosas) a iso-8859-1 en lugar de utf-8. Pero probablemente tuviste tus razones. – KarolDepka

6

Java en Windows no es compatible ouput Unicode de manera 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); 
     } 
    } 
}