2011-12-23 19 views
5

Entrada de consola (win), ¿cómo funciona la conversión de charset?traducción de chatset de consola java

El código siguiente, basura de salida de caracteres no ascii - InputStreamReader en el ejemplo siguiente no toma charset como argumento.

BufferedReader console = new BufferedReader(new InputStreamReader(System.in)); 
String inp = console.readLine(); 
System.out.println(inp.toUpperCase()); 

Al ser independiente del sistema operativo, ¿cómo resuelve Java todas las configuraciones posibles de juego de caracteres con respecto a la entrada de aviso de la consola?

Respuesta

12

En realidad, Java no maneja este problema en absoluto.

Simplemente asume que la codificación de la consola es la misma que la codificación predeterminada del sistema. This assumption is wrong on Windows systems, por lo tanto, Java no proporciona una buena solución para realizar la IO correcta de la consola con respecto a los caracteres que no son ASCII en Windows.

soluciones posibles son:

  • Uso System.console() introdujo en Java 6:

    BufferedReader in = new BufferedReader(System.console().reader()); 
    BufferedWriter out = new PrintWriter(System.console().writer(), true); 
    
    out.println(in.readLine().toUpperCase()); 
    

    Tenga en cuenta que puede volver System.console()null Cuando se programa ejecutar con redirigida IO, por ejemplo, en el IDE. Necesitas una alternativa para este caso.

  • Especificar consola de codificación de forma explícita:

    String consoleEncoding = "..."; 
    BufferedReader in = new BufferedReader(new InputStreamReader(System.in, consoleEncoding)); 
    BufferedWriter out = new PrintWriter(new OutputStreamWriter(System.in, consoleEncoding), true); 
    
    out.println(in.readLine().toUpperCase()); 
    

    Por lo que yo sé, no hay buenas maneras de determinar la codificación real de la consola mediante programación sin código nativo.

  • Especificar consola de codificación como codificación predeterminada utilizando file.encoding propiedad, por lo que el supuesto de que la consola IO utiliza la codificación por defecto sería correcto:

    java -Dfile.encoding=... ... 
    
5

1) Hablando en términos prácticos: ¿Cómo codificación de caracteres de trabajo, y cómo se debe hacer con ellos:

Cualquier secuencia de caracteres que se lee en está codificado/descodificado. Java agrupa los detalles de codificación/decodificación como parte del JDK: http://docs.oracle.com/javase/1.6/docs/guide/intl/encoding.doc.html. Ejemplo: UTF-8 issue in Java code.

2) Su pregunta específica: ¿CÓMO maneja el lenguaje multiplataforma JAVA la entrada de la consola que es específica para el sistema operativo?

La respuesta corta: aunque el código de bytes Java es de plataforma neutra, la JVM NO. Es decir, la funcionalidad de transmisión "in/out/err" del "Sistema" de Java no está completamente implementada en el viejo Java normal.

Cuando ejecuta Java, se carga la clase "Sistema", que abstrae la noción básica de un sistema en el que se ejecuta la JVM. En este momento, sus flujos de entrada/salida/error son (es decir, los objetos a los que está accediendo cuando escribe System.in, System.out, System.err están configurados en RUNTIME por ClassLoader, que es responsable, bueno ... clases de carga de Java.

En el caso del "sistema", la carga de clase es una tarea sofisticada, como da a entender, debido a la configuración de la clase Sistema (al igual que la creación de la java Runtime clase) es un nivel más bajo El problema de implementación de JVM es específico del sistema operativo.

De nuevo, solo para ser claros: aunque Java LANGUAGE es independiente de la plataforma, la JVM para su plataforma es, por lo tanto, a diferencia del lenguaje de programación Java, un Entorno específico del sistema operativo que crea los recursos a los que hacemos referencia en nuestro código en tiempo de ejecución.

Para una mayor comprensión: Verifique el código fuente real para la clase del sistema, es muy legible y le dará una mejor comprensión de lo que está pasando. En particular, observe el método nullInputStream():

http://www.java2s.com/Open-Source/Java-Document/6.0-JDK-Core/lang/java/lang/System.java.htm

Cuestiones relacionadas