Deutsche Umlaute



  • Deutsche Umlaute werden in der Win32-Konsole falsch angezeigt. Der Grund dafür sind Zeichensatz-Inkompatibilitäten. Während man während der Programmierung zumeist den ASCII-Zeichensatz verwendet, wird in der Konsole mit einem ANSI-Zeichensatz gearbeitet.

    Die Lösung: Anstatt des Zeichens fügt man während der Programmierung den ANSI-Code des Umlauts ein.

    1. Variante: Die ANSI-Codes werden als 'unsigned char' in Konstanten gespeichert. Während der Programmierung benötigt man dann kein weiteres Wissen über die einzelnen ANSI-Codes der Umalute, dafür hat man auch einen erhöhten Programmieraufwand:

    // C-Version:
    #define AE (unsigned char)142
    #define ae (unsigned char)132
    #define OE (unsigned char)153
    #define oe (unsigned char)148
    #define UE (unsigned char)154
    #define ue (unsigned char)129
    #define ss (unsigned char)225
    // Verwendungsbeispiel
    printf("%cbung macht den Meister!\n",UE);
    
    // C++-Version:
    const unsigned char AE = static_cast<unsigned char>(142);
    const unsigned char ae = static_cast<unsigned char>(132);
    const unsigned char OE = static_cast<unsigned char>(153);
    const unsigned char oe = static_cast<unsigned char>(148);
    const unsigned char UE = static_cast<unsigned char>(154);
    const unsigned char ue = static_cast<unsigned char>(129);
    const unsigned char ss = static_cast<unsigned char>(225);
    // Verwendungsbeispiel
    cout << UE << "bung macht den Meister!" << endl;
    

    2. Variante: Die ANSI-Codes der Umlaute werden über Escapesequenzen hexadezimal oder oktal in Strings eingefügt:

    Zeichen     Hex    Okt
    ========================
       'Ä'       8E     216
       'ä'       84     204
       'Ö'       99     231
       'ö'       94     224
       'Ü'       9A     232
       'ü'       81     201
       'ß'       E1     341
    
    // Verwendungsbeispiel
    printf("Heute ist ein sch\x94ner Tag!\n"); // \x leitet eine Hexadezimal-Escapesequenz ein
    cout << "Heute ist ein sch\x94ner Tag!" << endl;
    

    Diese Version hat allerdings einen Haken: Ist das nächste Zeichen ebenfalls hexadezimal bzw. oktal darstellbar, wird dieses Zeichen mitinterpretiert. Zum Beispiel würde im Wort "Oberfl\x84che" nicht '\x84' mit 'ä' ersetzt werden sondern 'x84c' mit der Zahl '2124'. Für dieses Problem gibt es allerdings einen kleinen Trick:

    cout << "Oberfl\x84 \bche" << endl;
    

    Nach dem Hex-Code fügt man ein Leerzeichen hinzu, dass sofort danach wieder mit der Escapesequenz '\b' für die Rücktaste wieder gelöscht wird (Dankeschön an einen unbekannten Zusender).

    MfG SideWinder

    PS: Wenn ihr Fehler findet, meldet euch bitte umgehend.