(Ayuda) Inconcluencias entre código ASCII y UNICODE

Iniciado por Seyro97, 17 Marzo 2015, 16:01 PM

0 Miembros y 1 Visitante están viendo este tema.

Seyro97

Hola, muy buenas. En primer lugar, a partir de ahora se supondrá que uso Java.

Estaba haciendo un ejercicio que decía así:


  • Lee un número por teclado y muestra por consola, el carácter al que pertenece en la tabla ASCII. Por ejemplo: si introduzco un 97, me muestre una a.

  • Modifica el ejercicio anterior, para que en lugar de pedir un número, pida un carácter (char) y muestre su código en la tabla ASCII.

Bien. He hecho el programa y todo va bien, pero con un problema. Cuando paso, por ejemplo, el carácter 'á' a número me da como resultado 160, el que le corresponde en ASCII. El problema es que a la hora de mostrar dicho carácter por pantalla se convierte a  UTF-8 (he hecho varias pruebas, y confirmo lo que digo.). Sabiendo que la consola trabaja con el código ASCII (Windows), y que el valor numérico de dicho carácter corresponde al código ASCII, ¿Por qué se muestra como UTF-8?

El código:

Código (java) [Seleccionar]
import java.util.Scanner;

public class Main {
public static void main(String[] args) {
Scanner Reader = new Scanner(System.in);
char Character = ' ';

System.out.print("Introduzca un caracter cualquiera: ");
Character = Reader.next().charAt(0);

System.out.println("El valor numérico de " + Character + " es " + ((int)Character));
}
}



MUCHAS GRACIAS POR ATENDERME
Carlos Peláez González. visita http://www.taringa.net/EnjoyC para muchos tutoriales!

Usuario Invitado

Tendrías que crear un array con todos los caracteres extendidos. Ejemplo:

Código (java) [Seleccionar]
import java.util.Scanner;

public class Main {
    public static final char[] EXTENDED = { 0x00C7, 0x00FC, 0x00E9, 0x00E2,
            0x00E4, 0x00E0, 0x00E5, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF,
            0x00EE, 0x00EC, 0x00C4, 0x00C5, 0x00C9, 0x00E6, 0x00C6, 0x00F4,
            0x00F6, 0x00F2, 0x00FB, 0x00F9, 0x00FF, 0x00D6, 0x00DC, 0x00A2,
            0x00A3, 0x00A5, 0x20A7, 0x0192, 0x00E1, 0x00ED, 0x00F3, 0x00FA,
            0x00F1, 0x00D1, 0x00AA, 0x00BA, 0x00BF, 0x2310, 0x00AC, 0x00BD,
            0x00BC, 0x00A1, 0x00AB, 0x00BB, 0x2591, 0x2592, 0x2593, 0x2502,
            0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557,
            0x255D, 0x255C, 0x255B, 0x2510, 0x2514, 0x2534, 0x252C, 0x251C,
            0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566,
            0x2560, 0x2550, 0x256C, 0x2567, 0x2568, 0x2564, 0x2565, 0x2559,
            0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588,
            0x2584, 0x258C, 0x2590, 0x2580, 0x03B1, 0x00DF, 0x0393, 0x03C0,
            0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4,
            0x221E, 0x03C6, 0x03B5, 0x2229, 0x2261, 0x00B1, 0x2265, 0x2264,
            0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A,
            0x207F, 0x00B2, 0x25A0, 0x00A0 };
   
    public static final char getAsciiCharacter(int code) {
        if (code >= 0x80 && code <= 0xFF) {
            return EXTENDED[code - 0x7F];
        }
        return (char) code;
    }
   
    public static final int getAsciiCode(char character) {
        int code = (int) character;
        for(short i=0; i < EXTENDED.length; i++) {
            if(EXTENDED[i] == character)
                code = 128 + i;
        }
        return code;
    }

    public static final void printCharacter(int code) {
        System.out.printf("%c%n", getAsciiCharacter(code));
    }

    public static void main(String[] args) {
        Scanner reader = new Scanner(System.in);
       
        System.out.print("Ingrese un carácter: ");
        char character = reader.next().charAt(0);
       
        int asciiCode = getAsciiCode(character);
       
        System.out.println("El carácter es "+ character +" y su código ascii es: " + asciiCode);
    }


}
"La vida es muy peligrosa. No por las personas que hacen el mal, si no por las que se sientan a ver lo que pasa." Albert Einstein

Seyro97

Carlos Peláez González. visita http://www.taringa.net/EnjoyC para muchos tutoriales!

Usuario Invitado

¿Muy largo? Jaja, en el mundo real esto es "muy pequeño". Pero es normal que se piense así cuando recién se está aprendiendo. Si no entendiste algo, házmelo saber para explicarte.
"La vida es muy peligrosa. No por las personas que hacen el mal, si no por las que se sientan a ver lo que pasa." Albert Einstein

Seyro97

No,muchas gracias :D Si que se que esto es corto, porque vengo de C++, pero pienso que para un ejercicio básico es muy largo
Carlos Peláez González. visita http://www.taringa.net/EnjoyC para muchos tutoriales!

Usuario Invitado

Pero esto no vendría a ser el ejercicio en si. Puede usarse como una clase utilitaria incluso la puedes exportar como JAR y en algún otro proyecto, solo importas el JAR y haces uso de la clase sin necesidad de volver a crearla. Así nacen las librerías  ;)
"La vida es muy peligrosa. No por las personas que hacen el mal, si no por las que se sientan a ver lo que pasa." Albert Einstein

Seyro97

Carlos Peláez González. visita http://www.taringa.net/EnjoyC para muchos tutoriales!

palsot

Hola!! me podrias ayudar por favor!! tu codigo me vino muy pero muy bien, solo una duda, porque no se imprimen los caracteres del 1 al 31? cuando me pide ingresar un caracter y pongo alguno que este en este intervalo me muestra un signo de interrogacion (?) y me pone que su codigo ascci es 63, del caracter 176 al 188 me pasa exactamente lo mismo y de ahi en adelante bueno.. algunos caracteres me arroja resultados correctos, otros no... pasaron años jaja pero agradeceria enormemente si pudoeras ayudarme.
gracias!!