Ver Mensaje Individual
  #2 (permalink)  
Antiguo 21/10/2010, 15:07
Avatar de HackmanC
HackmanC
 
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Sonrisa Respuesta: Problema codificación caracteres

Hola,

Posiblemente lo que sucede es que Java detecta la pagina de códigos del sistema operativo pero la consola usa otra página de códigos diferente. Veamos con ejemplos:

Crea una aplicación básica para probar:
(*nota: el archivo está guardado en ISO-8859-1 en este caso y es muy importante para demostrar el ejemplo)
Código:
public class prueba {
    public static void main(String[] args) {
	System.out.println(java.nio.charset.Charset.defaultCharset());
	System.out.println("á");
    }
}
Esta simple aplicación nos va a mostrar la página de códigos que está usando Java para mostrar los caracteres en la consola y seguidamente la letra á, pero va a variar dependiendo de la tabla de caracteres y la tabla con que está guardado el archivo.

Por ejemplo, Windows en Español normalmente usa la tabla de caracteres Windows-1252, pero la consola usa la tabla de caracteres en inglés CP437 (en mi caso la CP850). Ahora si ejecutamos esa aplicación en Windows en una consola nos va a mostrar lo siguiente:
Código:
windows-1252
ß
¿Que fue lo que sucedió? Java detecto la tabla de caracteres Windows-1252 en mi sistema y usó el código 225 (en hexadecimal 0xE1), si revisamos esa tabla nos va a mostrar que efectivamente es ese el código de la letra á. Windows-1252

Ahora la consola la muestra en lo que entendió, que es la página de código CP850, en esa página de código el número 225 (en hexadecimal 0xE1) es otro caracter completamente diferente ß. Code page 850

Al final lo que sucedió fue que las tablas no coinciden. Cuando una tabla de carateres cree que el 255 225 es la letra á, la otra tabla cree que es la letra ß.

La solución mas fácil para resolver este inconveniente es que uses la opción -D del interprete de Java. Y ejecutar la aplicación de esta forma:
Código:
java -Dfile.encoding=cp850 prueba
Obligando a Java a usar la tabla de código 850 para todos los archivos donde escriba, incluyendo la salida a la consola o terminal (que es un archivo). Y el resultado que obtendríamos sería el siguiente:
Código:
IBM850
á
En tu caso tendrías que averiguar cual la tabla de código que usa la consola, en Windows podrías usar el comando mode:
Código:
C:\>mode con

Estado para dispositivo CON:
----------------------------
    Líneas:              300
    Columnas:            120
    Ritmo del teclado:   31
    Retardo del teclado: 1
    Tabla de códigos:    850 
Saludos,

ps:

Al guardar el archivo en UTF8 e intentar mostrar en consola los caracteres extendidos es mas complicado porque 'según lo que yo tengo entendido' no hay forma que la consola de windows entienda UTF.

Última edición por HackmanC; 21/10/2010 a las 15:58 Razón: corrección 225 x 255