Java codiert nicht unbegründet Unicode-Zeichen in native systemcodierte Bytes, bevor sie in stdout
geschrieben werden. Einige Betriebssysteme, wie viele Linux-Distributionen, verwenden UTF-8
als ihren Standardzeichensatz, was nett ist.
Die Dinge unterscheiden sich unter Windows aus einer Reihe von Abwärtskompatibilitätsgründen ein wenig. Die Standard-Systemcodierung ist eine der "ANSI" Codepages und wenn Sie die Standard-Eingabeaufforderung (cmd.exe) öffnen, wird es eine der alten "OEM" DOS-Codepages (obwohl es möglich ist, ANSI und Unicode dort with a bit of work zu erhalten).
Da U + 0308 in keinem der "ANSI" Zeichensätze enthalten ist (wahrscheinlich in Ihrem Fall 1252), wird es als ein Fehlerzeichen (normalerweise ein Fragezeichen) codiert.
Eine Alternative zu Unicode-Enabling alles zu normalize die Kombinationssequenz U + 0069 U + 0308 mit dem Einzelzeichen 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);
}
Unter windows-1252
, wird dieser Code emittieren:
Literal: i?
Hex: 69 308
Literal: ï
Hex: ef
+1: Unter Ubuntu 9.04 in einem Terminal (gnome-terminal) ist die Ausgabe das i mit diaresis, wie Sie es wahrscheinlich erwarten. –
Ich mag dieses Wort "Diärese". Ich muss es vielleicht häufiger im Gespräch verwenden. – skaffman
:) versuchen Sie auch "Umlaut", und Sie werden der Mann des Abends sein. –