Umlaute aus csv. Datei richtig darstellen



  • Moin,

    gibt es irgendeine Möglichkeit wie ich Umlaute (+ ß) aus einer .csv Datei ausgeben kann. Also z.B in der .csv Datei steht: Hanß-Jürgen. Wenn ich jetzt die .csv Datei auslese und das Ergebnis mit cout ausgebe, wird das "ü" nicht richtig angezeigt.

    #include <iostream> 
    #include <fstream> 
    #include <string> 
    using namespace std; 
    
    int main(){ 
        string title = "", vname = "", nname = "", kuerzel = "", funktion = "", phone = "", fax = "", mphone = "", email = ""; 
        ifstream csvread; 
        csvread.open("test.csv", ios::in); 
        if(csvread.is_open() != true){ 
            cerr << "Fehler beim Lesen!" << endl; 
            csvread.close(); 
        } 
        else{
    		getline(csvread, title, ';');
    		getline(csvread, vname, ';');
    		getline(csvread, nname, ';');
    		getline(csvread, kuerzel, ';');
    		getline(csvread, funktion, ';');
    		getline(csvread, phone, ';');
    		getline(csvread, fax, ';');
    		getline(csvread, mphone, ';');
    		getline(csvread, email, '\n');
    		csvread.close();
        }
    	cout << title << endl;
    	cout << vname << endl;
    	cout << nname << endl;
    	cout << kuerzel << endl;
    	cout << funktion << endl;
    	cout << phone << endl;
    	cout << fax << endl;
    	cout << mphone << endl;
    	cout << email << endl;
    	system("PAUSE");
        return 0; 
    }
    

    Inhalt .csv Datei:

    Dr.;Hanß-Jürgen;Mustermann;hjm;Leitung IT;+49 12345678;+49 123456789;+49 12345698789;hans-jürgen.mustermann@test.com



  • Die Zeichen werden wahrscheinlich richtig eingelesen nur die Konsole kennt normal keine Umlaute omg dum?



  • Guest11111 schrieb:

    Die Zeichen werden wahrscheinlich richtig eingelesen nur die Konsole kennt normal keine Umlaute omg dum?

    Was hat das mit dumm zu tun? Ich bin Anfänger und lerne noch. 😉
    Und außerdem möchte ich, das die Konsole die Umlaute richtig ausgibt.



  • Sonderzeichen kann man über die Ascii-Werte ausgeben:

    #include <iostream>
    
    using namespace std;
    
    int main()
    { 
        for(int i = 0; i < 256; ++i)
    	    cout << i << ": " << char(i) << "\n";
    
        cout << "J" << char(129) << "rgen\n"; //variante 1.
        cout << "J\x81rgen\n"; //variante 2.
    
    	return 0; 
    }
    

    Für die zweite Variante siehe hier: http://de.wikipedia.org/wiki/Codepage_437

    Du kannst also die Sonderzeichen herausfiltern und musst sie für die Ausgabe ersetzen.



  • Normalerweise kann man die passende Sprache über std::io::imbue() einstellen. Das hat nur den Nachteil, dass der Locale-Name den man dem Ctor von std::locale mitgibt stark plattformanhäng ist.
    Unter Windows dürfte folgendes gehen:

    #include <iostream>
    #include <fstream>
    #include <string>
    #include <locale> //<--
    
    using namespace std;
    
    int main(){
        string title = "", vname = "", nname = "", kuerzel = "", funktion = "", phone = "", fax = "", mphone = "", email = "";
        ifstream csvread;
        csvread.open("test.csv", ios::in);
    
        try
        {
            locale loc("german");
    
            csvread.imbue(loc);
            cout.imbue(loc);
        }
        catch(exception & e)
        {
            cerr << e.what() << '\n';
        }
    
        if(csvread.is_open() != true){
            cerr << "Fehler beim Lesen!" << endl;
            csvread.close();
        }
        else{
            getline(csvread, title, ';');
            getline(csvread, vname, ';');
            getline(csvread, nname, ';');
            getline(csvread, kuerzel, ';');
            getline(csvread, funktion, ';');
            getline(csvread, phone, ';');
            getline(csvread, fax, ';');
            getline(csvread, mphone, ';');
            getline(csvread, email, '\n');
            csvread.close();
        }
        cout << title << endl;
        cout << vname << endl;
        cout << nname << endl;
        cout << kuerzel << endl;
        cout << funktion << endl;
        cout << phone << endl;
        cout << fax << endl;
        cout << mphone << endl;
        cout << email << endl;
        system("PAUSE");
        return 0;
    }
    


  • Der Code ist etwas speziell. Was man vereinfachen könnte:

    string title = "", vname = "", ...;
    // ->
    string title, vname, ...;
    
    ifstream csvread; 
    csvread.open("test.csv", ios::in);
    // ->
    ifstream csvread("test.csv", ios::in);
    
    if(csvread.is_open() != true)
    // ->
    if(!csvread.is_open())
    
    csvread.close();
    // ->
    // nichts (warum schliessen, was gar nicht geöffnet wurde?)
    // (oder warum schliessen, was automatisch geschlossen wird?)
    


  • @ Tachyon: Wird leider immer noch nicht richtig ausgegeben, aber ich hätte zu deinem Codeabschnitt noch ein paar fragen.

    try 
        { 
            locale loc("german"); 
    
            csvread.imbue(loc); 
            cout.imbue(loc); 
        } 
        catch(exception & e) 
        { 
            cerr << e.what() << '\n'; 
        }
    

    Ich habe mit try und catch noch nicht gearbeitet, was genau bewirkt jetzt dieser Code von dir?

    @ Nexus: Danke für deine Tipps. Ganz ehrlich, ich weiß nicht warum ich csv.close(); dort hingeschrieben habe. 🙄 Im Nachhinein ist es mir auch einleuchtend, dass das unnütz war.



  • Blacky666 schrieb:

    Ich habe mit try und catch noch nicht gearbeitet, was genau bewirkt jetzt dieser Code von dir?

    Der gewählte Konstruktor von std::locale wirft eine std::runtime_error -Exception, wenn es das übergebene Locale auf dem System nicht gibt. Sollte eine Exception auftreten, wird diese im catch-Block aufgefangen, und eine Fehlermeldung ausgegeben.

    Achso: Ich glaube, MS benutzt die locale-Einstellung von C. std::ios::imbue() funktioniert unter Windows irgendwie nicht richtig.
    Probier mal folgendes...

    try
        {
            locale::global(locale("german"));
        }
        catch(exception & e)
        {
            cerr << e.what() << '\n';
        }
    

    ...anstatt der imbue-Geschichte.



  • Tachyon schrieb:

    Blacky666 schrieb:

    Ich habe mit try und catch noch nicht gearbeitet, was genau bewirkt jetzt dieser Code von dir?

    Der gewählte Konstruktor von std::locale wirft eine std::runtime_error -Exception, wenn es das übergebene Locale auf dem System nicht gibt. Sollte eine Exception auftreten, wird diese im catch-Block aufgefangen, und eine Fehlermeldung ausgegeben.

    Achso: Ich glaube, MS benutzt die locale-Einstellung von C. std::ios::imbue() funktioniert unter Windows irgendwie nicht richtig.
    Probier mal folgendes...

    try
        {
            locale::global(locale("german"));
        }
        catch(exception & e)
        {
            cerr << e.what() << '\n';
        }
    

    ...anstatt der imbue-Geschichte.

    Super, Danke es klappt! 🙂


Anmelden zum Antworten