Umlaute über cin in ein char-Variable???



  • Hi zusammen,
    ich hab wegen dieses Problems schon die Suchfunktion im Forum benutzt und mich auch in der C++-Hilfe schlau gemacht, aber irgendwie bin ich nicht fündig geworden. 😕

    Ich möchte in einer Konsolenanwendung über cin einen Text ind eine Char-Variable einlesen, aber wenn ich z.B. Schäfer eingebe kommt am Schluss Sch„fer dabei raus.

    Hier ein Ausschnitt aus meinem Programm:

    char	cName0[40];    // <-ist Teil einer Struktur
    
    cout << "Vorname: ";
    cin >> tmpData->Data.cName0;
    

    Kann mir einer bei deisem Problem helfen???



  • Das liegt ganz einfach daran, dass der ASCII-Zeichensatz keine Umlaute kennt.
    Da musst du schon auf die wide-characters zurückgreifen:

    #include <iostream>
    #include <string>
    using namespace std;
    
    int main()
    {
    	wstring name;
    	wcout << L"Enter your name: ";
    	wcin >> name;
    	wcout << L"\nYour name is " << name << L".";
    
    }
    


  • So, hab jetzt also alle char rausgeschmissen und durch wchar_t ersetzt.
    Funktioniert soweit ganz gut, aber jetzt ist unvermittelt ein neues Problem aufgetaucht, welches ich mir überhaupt nicht erklären kann 😞 ...

    wcout << L"            Mini-Datenbank 2006" << endl;
    wcout << endl;
    wcout << L" Men\x81" << endl;
    wcout << L"  1. neue Person hinzuf\x81gen\n";
    wcout << L"  2. alle Personen auflisten\n";
    wcout << L"  3. Personendaten \x84ndern\n";
    wcout << L"  4. Person l\x94schen\n";
    wcout << L"  5. Person suchen\n";
    wcout << L"  6. Programm beenden\n";
    wcout << L"Eingabe: ";
    wcin >> cMenu;
    

    Man sollte von diesen zeilen ja jetzt eigentlich erwarten, dass diese hübsch im Konsolenfenster angezeigt werden, aber Pustekuchen. Er zeichnet mir hübsch alles bis " 3. Personendaten " (inklusive dem Leerzeichen) und zeichnet dann einfach nicht weiter. Scheinbar scheint er aber bis zum wcin weiter zu laufen, da bei einer Eingabe von 6 das Programm ordnungsgemäß beendet wird.



  • /// einmal am Programmbeginn
    cin.imbue( locale("de_DE"));
    cout.imbue( locale("de_DE"));
    
    ...
    
    char	cName0[40];    // <-ist Teil einer Struktur
    
    cout << "Vorname: ";
    cin >> tmpData->Data.cName0;
    

    Die Strings de_DE, die ein entsprechendes Locale selektieren sind aber leider von Compiler zu Compiler unterschiedlich und nicht standardisiert. Du wirst also in deiner Compilerdoku nachschauen müssen.

    Das Umstellen das Locales hat aber auch Auswirkungen auf z.B. die Ausgabe von Fließkommazahlen (Punkt und Komma im Gegensatz zur englischen Kodierung vertauscht).



  • Liegt an deinen Escape-Sequenzen für die Umlaute, schmeiß die raus und mach die Umlaute normal rein



  • Hab jetzt die Ausgabe nur da, wo es nötig ist mit wcout gemacht. An allen anderen Stellen hab ich ganz normal cout verwendet:

    cout << "            Mini-Datenbank 2006" << endl;
    cout << endl;
    cout << " Men\x81" << endl;
    cout << "  1. neue Person hinzuf\x81gen\n";
    cout << "  2. alle Personen auflisten\n";
    cout << "  3. Personendaten \x84ndern\n";
    cout << "  4. Person l\x94schen\n";
    cout << "  5. Person suchen\n";
    cout << "  6. Programm beenden\n";
    cout << "Eingabe: ";
    wcin >> cMenu;
    

    und es funktioniert endlich problemlos 😋
    Danke für eure Hilfe



  • Jo lieber gefrickelt, statt einfach die Umlaute reingeschrieben 🙄 🙄 🙄 👎



  • Anon schrieb:

    Das liegt ganz einfach daran, dass der ASCII-Zeichensatz keine Umlaute kennt.
    Da musst du schon auf die wide-characters zurückgreifen:

    Beobachtung stimmt, Folgerung nicht ganz. Richtig ist, dass ASCII keine Umlaute kennt, aber ASCII standardisiert auch nur bis 127, darueber liegen meistens diverse Sonderzeichen, inklusive deutschen Umlauten.



  • @anon:
    Tja, wenn es doch so einfach wär einfach die Umlate rein zu schreiben, aber dann bekomm ich nur so schöne Zeichen:

    wchar << L"ÄäÖöÜüß";
    

    erzeugt: "-", ein o mit einem ~ drauf, geteilt Zeichen, ausgefülltes Rechteck, "³", ausgefülltes Rechteck.

    Da is nix mit einfach Umlaute reinschreiben!!



  • Bashar natürlich hast du da recht, aber "char" ist ja nichtmal im standard auf signed oder unsigned festgelegt, also bleibt einem nichts anderes übrig als 0-127 als gültige werte für Zeichen anzusehen => ASCII

    Wenn deine Shell da falsche Zeichen darstellt, dann liegt das nicht an deinem C++-Programm.



  • So, also meine Ausgabe auf dem Bildschirm ist ja jetzt wunderschön so mit ä's und ö's, aber beim Speichern eines Strings (wchar_t) gibt es jetzt probleme.
    lese ich über wcin "Schäfer" ein und gebe es über wcout aus, so erscheint "Schäfer" auf dem Bildschirm. Wenn ich das jetzt aber in eine Datei mithilfe von fputws schreiben will steht dann "Sch„fer" drin. Das Programm setzt also für das "ä" den Hexcode 84 statt E4 ein.
    Auch die Umstellung über cin.imbue, cout.imbue, wcin.imbue, wcout.imbue auf "German" war nicht von Erfolg gekrönt.
    ich hab auch keine Lust jedesmal bei der Ausgabe in eine Datei den String zu prüfen, ob ein Umlaut drin ist und den dann entsprechend zu ersetzten.



  • Schreib mal äüö in ne Datei, also ohne deine Escape-Sequenzen dafür zu verwenden.
    Wie gesagt liegt an der verwendeten shell.



  • Wenn ich "ÄäÖöÜüß" über fputs ausgeb ist alles in Ordnung, bei fputws wird aber nix in die Datei reingeschrieben!!
    Wie kann ich das mit der shell ändern??



  • Anon schrieb:

    Jo lieber gefrickelt, statt einfach die Umlaute reingeschrieben 🙄 🙄 🙄 👎

    das blöde ist, daß der editor unter umständen eine andere codepage benutzt als die konsole. da klappt das mit dem direkt reinschreiben leider nicht. und auch L"..."-stings nutzen nix, wenn der editor kein unicode benutzt. und selbst wenn, der c++-compiler verlangt ascii-quelltexte. da hilft eben nur "gefrickel" 🙄



  • Konfusius schrieb:

    Anon schrieb:

    Jo lieber gefrickelt, statt einfach die Umlaute reingeschrieben 🙄 🙄 🙄 👎

    das blöde ist, daß der editor unter umständen eine andere codepage benutzt als die konsole. da klappt das mit dem direkt reinschreiben leider nicht. und auch L"..."-stings nutzen nix, wenn der editor kein unicode benutzt. und selbst wenn, der c++-compiler verlangt ascii-quelltexte. da hilft eben nur "gefrickel" 👎

    Eben, bevor man mal schaut ob der Editor das auch gescheit speichert oder speichern kann, lieber frickeln 👍



  • offensichtlich kann es der editor des threadstarters nicht, denn sonst hätte er ja kein problem.

    PS: auf einmal spinnt das login 😡



  • Versuch es auf der alten Weise und nutze dabei die ASCII - Tabelle.
    so würde bspw. der Schäfer so geschrieben werden:

    cout << "Sch\x84fer";
    

    für ein ö war es \x94
    und für ein ü war es \x81
    Ä = \x8E
    Ö = \x99
    Ü = \x9A
    Dazu zusagen ist das du in einer cout Anweisung nicht mehr als zwei bspw. Ö's nehmen kannst



  • Das mit dem cout und so hab ich ja mitlerweile im Griff, aber wenn ich jetzt mit wcin z.B. ein "ö" eingelesen hab und mit fputws in eine Datei schreiben will, dann kommt da nur Sch.... an. Er schreibt zwar den hexcode 84 in die Datei, aber wenn ich die dann wordpad o.ä. öffne, dann steht da kein "ö"!!! So weit ich das jetzt rausbekommen hab muss da der Hex-Code E4 stehen um ein "ö" anzuzeigen.



  • Wo willst du die Ausgabe denn sehen, in der Kommandozeile oder in der Datei?



  • in der Datei


Anmelden zum Antworten