Umlaute in std::vector<std::string>



  • Ich hab ein problem mit den Umlauten. Normalerweise hab ich Umalute nur immer mit cout ausgegeben.

    cout << "Sch\x94n" << endl;
    cout << "Stra" << "\xE1" << "e" << endl;
    

    Ich gebe einfach statt der Zeichen den OEM-Code an. Ja schön und gut wie man sieht hab ich bei dem Wort "Straße" schon meine Probleme gehabt, da wenn ich geschrieben hätte:

    cout << "Stra\xE1e" << endl;
    

    Wäre das hier rausgekommen:

    Stra▲

    So hm jetzt stellt sich mir die Frage warum ist das so? Das wird wohl irgendwas mit dem "e" nach dem "ß" zu tun haben. (Also jetzt bei Straße)
    Ja gut wenn ich das mit cout mache dann kann ich das durch den Trick siehe oben beheben.
    Aber wenn ich jezt etwas an einen vetor zuweisen möchte was dann???

    standards.push_back("Stra\xE1e");
    

    Da kann ich ja nicht:

    standards.push_back("Stra" << "\xE1" << "e");
    

    machen. 😞 Hat jemand eine Antwort auf mein Problem wie kann ich jetzt z.B.Straße mit funktionierendem "ß" an meinen vector zuweisen?
    Dankeschön schon mal im Voraus.

    PS: Das gleiche blöde Problem gibts auch z.B. bei dem Wort heißen (Den Satz brauch ich oft in Programmen: "Wie heißen sie?")



  • Ja, du gibts die Dinger in der Windows-Konsole aus? Und die hat ne andere Codepage. Das ist nicht C++' Schuld. Und der Vector hat am wenigsten was mit der Sache zu tun. Wenn, dann eher der String im Vector. Aber auch der String nicht, weil String nur ein Datenbehälter ist.

    Benutze am besten Unicode-Zeichen: http://www.unicode.org/charts/PDF/U0080.pdf Da ist das "ß" 0xDF und nicht 0xE1.

    Aber du wirst in der Windows-Konsole immer Probleme mit Zeichen außerhalb von ASCII haben. Das liegt in der Natur der Sache, weil die Windows-Konsole keine Unicode-Konsole ist.

    http://de.wikipedia.org/wiki/Ascii

    Gib dir einfach in einer for-Schleife alle 255 Zeichen aus. Dann siehste welcher Code das ß ist. 😉 Kenne leider nicht den Namen der dt. Codepage, die die Win-Konsole hat. Frage sowas am besten im WinAPI-Forum nach. Weil C++ hat damit nichts zu tun.



  • Und dein Problem dürfte hauptsächlich sein, daß Hex-Escape-Zeichen so weit interpretiert werden, wie der Compiler die nachfolgenden Zeichen als Hex-Ziffer erkennen kann. Eine Lösung wäre es, den String (wie von dir angedeutet) aus Einzelteilen zusammenzusetzen:

    standards.push_back(string("Stra\xE1")+"e");
    

    Oder du verwendest alternativ Oktal-Escapes:

    standards.push_back("Stra\341e"=;
    


  • Artchi schrieb:

    Ja, du gibts die Dinger in der Windows-Konsole aus? Und die hat ne andere Codepage. ...

    Aber du wirst in der Windows-Konsole immer Probleme mit Zeichen außerhalb von ASCII haben. Das liegt in der Natur der Sache, weil die Windows-Konsole keine Unicode-Konsole ist.

    Die Windows-Konsole stellt den Unicode-Font "Lucida Console" zur Verfügung, damit wird die richtige Ausgabe möglich.

    CStoll schrieb:

    Und dein Problem dürfte hauptsächlich sein, daß Hex-Escape-Zeichen so weit interpretiert werden, wie der Compiler die nachfolgenden Zeichen als Hex-Ziffer erkennen kann. Eine Lösung wäre es, den String (wie von dir angedeutet) aus Einzelteilen zusammenzusetzen:

    standards.push_back(string("Stra\xE1")+"e");
    

    Oder du verwendest alternativ Oktal-Escapes:

    standards.push_back("Stra\341e"=;
    

    Anstelle solcher Verrenkungen ist die Einstellung der richtigen Bildschirmschriftart und Codepage eine Alternative.

    #include <iostream>
    
    int main()
    {
        // Als erstes muss man unter Windows für das Konsolenfenster im Menü links oben
        // unter Eigenschaften die richtige Bildschirmschrift einstellen.
        // Der Unicode-Font "Lucida Console" ist für alle verfügbaren Codepages das Richtige.
        // Die ansonsten zur Verfügung stehende Rasterschriftart bringt's nicht! 
        // Es muss die für Deutschland gültige Codepage für die Bildschirmschrift eingestellt werden.
        system("MODE CON CP SELECT=1252"); 
    
        char c[]= "aouAOUäöüÄÖÜß";
    
        std::cout << c << std::endl;
    }
    

    mfg



  • @Helmut

    Das funktioniert bei mir nicht ganz. Ich erhalte nur folgende Ausgabe:

    Status von Gerät CON:
    ---------------------
        Zeilen:             300
        Spalten:            80
        Wiederholungsrate:  31
        Verzögerungszeit:   1
        Codepage:           1252
    

    Liegt es daran, dass ich Windows 2000 habe?

    mfg.



  • Windows 2000 kann, glaub ich, nicht die Ursache sein, bei mir läuft XP.
    Als erstes muss man im Menü des Konsolenfensters links oben unter Eigenschaften die richtige Bildschirmschrift einstellen.
    'Lucida Console' - möglichst für alle Fenster gleichen Namens, damit beim nächsten Start die Einstellungen stimmen.
    Teste mal hiermit:

    #include <windows.h>
    #include <iostream> 
    
    int main() 
    { 
        char c[]= " äöüÄÖÜ "; 
    
        if (SetConsoleOutputCP(1252))
            std::cout << "Umlaute:" << c << "nicht lesbar? 'Lucida Console' als Bildschirmschrift einstellen!" << std::endl; 
        else
            std::cout << "Fehler! Code Page konnte nicht gesetzt werden." << std::endl;
    }
    

    mfg


Anmelden zum Antworten