Java, no sin razón, codifica caracteres Unicode en bytes codificados en el sistema nativo antes de escribirlos en stdout
. Algunos sistemas operativos, como muchas distribuciones de Linux, usan UTF-8
como su conjunto de caracteres predeterminado, lo cual es bueno.
Las cosas son un poco diferentes en Windows por una variedad de razones de compatibilidad con versiones anteriores. La codificación predeterminada del sistema será una de las páginas de códigos "ANSI" y si abre el símbolo del sistema predeterminado (cmd.exe) será una de las antiguas páginas de códigos "OEM" de DOS (aunque es posible obtener ANSI y Unicode allí with a bit of work)
Dado que U + 0308 no está en ninguno de los juegos de caracteres "ANSI" (probablemente 1252 en su caso), se codificará como un carácter de error (generalmente un signo de interrogación).
Una alternativa a Unicode que permite que todo está a normalize la secuencia de la combinación de U + 0069 U + 0308 con el único carácter U + 00EF:
public static void emit(String foo) throws IOException {
System.out.println("Literal: " + foo);
System.out.print("Hex: ");
for (char ch : foo.toCharArray()) {
System.out.print(Integer.toHexString(ch & 0xFFFF) + " ");
}
System.out.println();
}
public static void main(String[] args) throws IOException {
String foo = "\u0069\u0308";
emit(foo);
foo = Normalizer.normalize(foo, Normalizer.Form.NFC);
emit(foo);
}
Bajo windows-1252
, este código emitirá:
Literal: i?
Hex: 69 308
Literal: ï
Hex: ef
+1: en Ubuntu 9.04 en un terminal (gnome-terminal) la salida es la i con diaresis como probablemente se espera. –
Me gusta esta palabra "diaéresis". Es posible que deba usarlo más a menudo en una conversación. – skaffman
:) intenta también "umlaut", y serás el hombre de la noche. –