2010-03-10 21 views
16

Tengo un programa que se ejecuta en una consola y sus diéresis Umlauts y otros caracteres especiales se envían como '? En Macs. Aquí es un simple programa de pruebas:Java: cómo detectar (¿y cambiar?) La codificación de System.console?

public static void main(String[] args) { 
    System.out.println("höhößüä"); 
    System.console().printf("höhößüä"); 
} 

En una consola de Mac por defecto (con defecto codificación UTF-8), esta imagen Impresiones:

h?h???? 
h?h???? 

Pero después de ajustar manualmente la codificación de la terminal de Mac para "Mac OS romana ", se imprime correctamente

höhößüä 
höhößüä 

Tenga en cuenta que en los sistemas Windows utilizando System.Console() funciona:

h÷h÷▀³õ 
höhößüä 

Entonces, ¿cómo hago mi programa ... rolleyes ... "ejecutar en todas partes"?

Respuesta

8

Epaga: echar un vistazo a la derecha here. Puede establecer la codificación de salida en una secuencia de impresión, solo tiene que determinar o estar absolutamente seguro de qué se está configurando.

import java.io.PrintStream; 
import java.io.UnsupportedEncodingException; 

public class Test { 
    public static void main (String[] argv) throws UnsupportedEncodingException { 
    String unicodeMessage = 
    "\u7686\u3055\u3093\u3001\u3053\u3093\u306b\u3061\u306f"; 

    PrintStream out = new PrintStream(System.out, true, "UTF-8"); 
    out.println(unicodeMessage); 
    } 
} 

Para determinar la consola de codificación que podría utilizar el comando del sistema "local" y analizar la salida, que - en un alemán UTF-8 sistema se ve:

LANG="de_DE.UTF-8" 
LC_COLLATE="de_DE.UTF-8" 
LC_CTYPE="de_DE.UTF-8" 
LC_MESSAGES="de_DE.UTF-8" 
LC_MONETARY="de_DE.UTF-8" 
LC_NUMERIC="de_DE.UTF-8" 
LC_TIME="de_DE.UTF-8" 
LC_ALL= 
+0

2 problemas: 1) ¿cómo sé qué codificación se establece en la consola? 2) ¿hay alguna manera de seguir trabajando con System.console()? – Epaga

+0

No, no puede retener su código usando 'System.console()', y no lo veo crítico. 'PrintStream' también tiene todo lo que desea y * funciona * correctamente. +1 por la respuesta de mi parte – dimitarvp

+0

1) Puede usar el comando de sistema "configuración regional" y analizar su salida. – gamma

12

Pruebe lo siguiente de línea de comandos argumento al iniciar su aplicación:

-Dfile.encoding=utf-8

Esto cambia la codificación predeterminada de la JVM para las operaciones de E/S.

También puede probar:

System.setOut(new PrintStream(System.out, true, "utf-8")); 
+1

problema con esto es que estoy enviando este programa de consola como un contenedor, por lo que estoy buscando una solución que no implique que el usuario tenga que agregar sus propios argumentos de línea de comando. – Epaga

+1

@Epaga: ¿usar un archivo de murciélago o un envoltorio para el frasco? – Bozho

+1

-Dfile.encoding = utf-8 no es una opción estándar y debe evitarse. – n0rm1e

Cuestiones relacionadas