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 vonstd::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 einestd::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 einestd::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!