Java: ¿Cómo detectar (y cambiar?) La encoding de System.console?

Tengo un progtwig que se ejecuta en una consola y sus Umlauts y otros caracteres especiales se envían como ‘? En Macs. Aquí hay un progtwig de prueba simple:

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

En una consola Mac predeterminada (con encoding UTF-8 predeterminada), imprime:

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

Pero después de configurar manualmente la encoding del terminal Mac a “Mac OS Roman”, imprimió correctamente

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

Tenga en cuenta que en los sistemas Windows que utilizan System.console () funciona:

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

Entonces, ¿cómo hago que mi progtwig … rolleyes … “corra a todas partes”?

Epaga: echa un vistazo aquí . Puede establecer la encoding 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 encoding de la consola, puede usar el comando del sistema “configuración regional” y analizar el resultado que, en un sistema alemán UTF-8, se ve así:

 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= 

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

-Dfile.encoding=utf-8

Esto cambia la encoding predeterminada de la JVM para las operaciones de E / S.

También puedes probar:

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