Pregunta

¿Por qué se muestra diferente lo siguiente en Linux vs Windows?

System.out.println(new String("¿".getBytes("UTF-8"), "UTF-8"));

en Windows:

& # 191;

en Linux:

& # 194; & # 191;

¿Fue útil?

Solución

System.out.println () genera el texto en la codificación predeterminada del sistema, pero la consola interpreta esa salida según su propia configuración de codificación (o " página de códigos "). En su máquina Windows, las dos codificaciones parecen coincidir, pero en el cuadro de Linux, la salida está aparentemente en UTF-8, mientras que la consola lo está decodificando como una codificación de un solo byte como ISO-8859-1. O tal vez, como sugirió Jon, el archivo fuente se está guardando como UTF-8 y javac lo está leyendo como otra cosa, un problema que se puede evitar mediante el uso de escapes de Unicode.

Cuando necesita generar algo que no sea texto ASCII, su mejor opción es escribirlo en un archivo con una codificación adecuada, luego leer el archivo con un editor de texto: las consolas son demasiado limitadas y dependen del sistema. Por cierto, este bit de código:

new String("¿".getBytes("UTF-8"), "UTF-8")

... no tiene efecto en la salida. Todo lo que hace es codificar el contenido de la cadena en una matriz de bytes y descodificarla nuevamente, reproduciendo la cadena original, un costoso no operativo. Si desea generar texto en una codificación en particular, debe usar un OutputStreamWriter, como por ejemplo:

FileOutputStream fos = new FileOutputStream("out.txt");
OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");

Otros consejos

No estoy seguro de dónde está exactamente el problema, pero vale la pena señalarlo

& # 194; & # 191; (0xc2,0xbf)

es el resultado de la codificación con UTF-8

0xbf,

que es el punto de código Unicode para & # 191;

Por lo tanto, parece que en el caso de Linux, la salida no se muestra como utf-8, sino como una cadena de un solo byte

Comprueba qué codificación tiene tu terminal linux.

Para gnome-terminal en ubuntu: vaya a " Terminal " menú y seleccione " Establecer codificación de caracteres " ;.

Para masilla, Configuración - > Ventana - > Traducción - > UTF-8 (y si eso no funciona, consulte esta publicación ).

Ejecute este código para determinar si se trata de un problema de compilación o consola:

public static void main(String[] args) throws Exception {
    String s = "¿";
    printHex(Charset.defaultCharset(), s);

    Charset utf8 = Charset.forName("UTF-8");
    printHex(utf8, s);
}

public static void printHex(Charset encoding, String s)
        throws UnsupportedEncodingException {
    System.out.print(encoding + "\t" + s + "\t");

    byte[] barr = s.getBytes(encoding);
    for (int i = 0; i < barr.length; i++) {
        int n = barr[i] & 0xFF;
        String hex = Integer.toHexString(n);
        if (hex.length() == 1) {
            System.out.print('0');
        }
        System.out.print(hex);
    }
    System.out.println();
}

Si los bytes codificados para UTF-8 son diferentes en cada plataforma (debería ser c2bf ), es un problema del compilador.

Si se trata de un problema de compilación, reemplace " & # 191; " con " \ u00bf " .

Es difícil saber exactamente qué bytes contiene su código fuente, o la cadena a la que se llama getBytes (), debido a las codificaciones de su editor y compilador.

¿Puede producir un programa corto pero completo que contenga solo ASCII (y el \ uxxxx relevante que se escapa en la cadena) que aún muestre el problema?

Sospecho que el problema puede estar en la salida de la consola en Windows o Linux, pero sería bueno obtener primero un programa reproducible.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top