Pregunta

Tratamos de utilizar Java y UTF-8 en Windows.La aplicación escribe registros en la consola, y nos gustaría utilizar la codificación UTF-8 para los registros como nuestra aplicación se ha internacionalizado en los registros.

Es posible configurar la JVM por lo que genera UTF-8, mediante -Dfile.encoding=UTF-8 como argumentos para la JVM.Funciona bien, pero la salida de una consola de Windows es ilegible.

Entonces, se puede establecer la página de códigos de la consola para 65001 (chcp 65001), pero en este caso, el .bat los archivos no funcionan.Esto significa que cuando tratamos de iniciar nuestra aplicación a través de nuestro script (nombre de inicio.bat), no pasa 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 problema, y la aplicación se puede iniciar.

Cualquier sugerencias acerca de eso?

¿Fue útil?

Solución

Trate de chcp 65001 && start.bat

Otros consejos

Java en windows NO es compatible con unicode de salida por defecto.He escrito una solución por el método llamando a la API Nativa con JNA de la biblioteca.El método se llame WriteConsoleW para unicode de salida de 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);
        }
    }
}

Hemos tenido algunos problemas similares en Linux.Nuestro código fue en ISO-8859-1 (en su mayoría cp-1252 compatible) pero la consola se UTF-8, por lo que el código no compila.Simplemente cambiar la consola a ISO-8859-1 hacer que el script de compilación, en UTF-8, para romper.Hemos encontrado un par de opciones:
1 - definir un estándar de codificación y pegajosa a ella.Que fue nuestra elección.Podemos optar por mantener todo en ISO-8859-1, modificando los scripts de generación.
2 - Configuración de la codificación antes de comenzar cualquier tarea, incluso dentro de la construcción de guiones.Algunos códigos como el de erickson dijo.En Linux era como :

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

Mi eclipse es todavía como este.Ambos funcionan bien.

Has probado PowerShell en lugar de la vieja cmd.exe.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top