ö, ä, ü usw.. in strings einlesen und abspeichern



  • Hallo, ich hab ein Problem beim einlesen und abspeichern von strings in einer datei.

    und zwar, wenn ich mit diesem code:

    #include <iostream>
    #include <fstream>
    using namespace std;
    
    int main(void)
    {
        string eingabe;
        getline(cin, eingabe);
        ofstream out("Datei.html");
        out << eingabe;
        reutrn 0;
    }
    

    zeichen wie z.b. ö, ä oder ü einlese und abspeichern lasse, dann kommen in dem erstellten html-dokument kein ö, ä oder ü raus, sondern irgendwelche komische zeichen an. Woran liegt das, und wie kann ich das umgehen? das ich alle zeichen einlesen und abspeichern kann.

    Danke.

    MFG Max



  • Edit: Sry, das sollte return 0; heisen xD
    der code funktioniert bei mir jedenfalls, nur halt ohne sonderzeichen und umlaute usw..



  • Hallo

    Das ist nicht ein Problem von C++, auch die Umlaute werden korrekt in der erstellten Datei gespeichert (mach die mal in einem einfachen Texteditor auf).

    Sondern das Problem ist das im HTML-Format alle Umlaute und auch andere Sonderzeichen maskiert werden müßen. Siehe zum Beispiel hier. Du must also beim einlesen der betroffenen Zeichen nicht das Zeichen selber in den Filestream schreiben sondern die Maskierung.

    bis bald
    akari



  • wow, danke für die schnelle antwort 😃
    hm.. und wie soll ich das dann machen? ich muss ja anstatt ä z.b. ä reinschreiben lassen, wie mach ich das am einfachsten bei den strings? ich muss die strings dazu ja auswerten, gibt es eine möglichkeit, das die eingabe buchstabe für buchstabe erst in einen ziwschenspeicher kommt, der dann überprüft wird, und bei der eingabe von sonderzeichen dann anstatt ä ä in den string schreibt?

    Mfg Max



  • Ich wuerd ne funktion schreiben die mittels string::find() und string::replace() due Umlaute im fertigen String sucht und dann durch die Maskierungen ersetzt.

    http://www.cplusplus.com/reference/string/string/



  • akari schrieb:

    Sondern das Problem ist das im HTML-Format alle Umlaute und auch andere Sonderzeichen maskiert werden müßen.

    Nein, das ist falsch. Natürlich kann man auch in HTML – eine ordentliche Codierung vorausgesetzt – Sonderzeichen als solche benutzen, ohne den Umweg über Maskierung gehen zu müssen. HTML-Maskierung ist übrigens „out“. Heutzutage verwendet man eine anständige Codierung, Maskierungen machen nur Probleme (z.B. im Zusammenspiel mit XHTML).

    C++ ist hier leicht eingeschränkt, da die Standard-Ströme machen, was sie wollen. Unter Linux wird AFAIK z.B. je nach Installation eine andere Codierung benutzt, meist sollte es ISO-8859-1 sein. Unter Windows wird etwas noch komischeres verwendet, wenn von der Konsole gelesen wird (irgendeine OEM-Codierung?). Beim Lesen von Dateien sollte auf europäischen Systemen Windows-1252 verwendet werden.

    Wie dem auch sei, das ganze *ist* ein Problem von C++. Der nächste Standard wird's hoffentlich lösen. Bis dahin muss man locales verwenden.



  • inwiefern "locales" ? d.h. also, ich muss die strings überprüfen und umlaute mit den maskierungen ersetzen? oder werden die umlaute in den string erst gar nicht bzw gleich falsch eingelesen? gibt es dazu überhaupt eine lösung?



  • Metaby schrieb:

    inwiefern "locales" ? d.h. also, ich muss die strings überprüfen und umlaute mit den maskierungen ersetzen? oder werden die umlaute in den string erst gar nicht bzw gleich falsch eingelesen? gibt es dazu überhaupt eine lösung?

    Ich sage doch: *keine* Maskierungen verwenden. Locales erlauben das Einlesen von Strings in einer gewählten Codierung. Nur leider klappt das (zumindest unter Windows) nicht in der Konsole. Ansonsten sollte im Prinzip auch Dein Originalcode (ohne locales) klappen, denn es werden ja dieselben Zeichen in Deine Datei geschrieben, die Du einliest. Da ist die Codierung egal.

    Ansonsten versuch doch unter Windows mal folgendes:

    cin.imbue(locale("iso_8859_15"));
    getline(cin, eingabe);
    ofstream out("Datei.html");
    out << eingabe;
    


  • Ach so, unter Windows sollte es prinzipiell mit 'OemToChar' aus <windows.h> funktionieren.



  • also, mit cin.imbue(locale("iso_8859_15"));
    funktioniert es auch nicht, und es werden auch keine ö ä oder ü's abgespeichert, ich bekomme nach wie vor immer das gleiche heraus. Anstatt ä irgendein zeichen.

    trozdem danke für die mühe

    MFG Max



  • 1. Muss man wissen, was man speichert.
    2. EInfach Umlaute in den Sourcecode-Editor eingeben, ist unschlau, weil man so an den Editor verdammt ist. Wenn der Code XYZ benutzt, und die Windows-Konsole Code ABC, kann es ja nur im Brei enden. Und ein anderer Text-Viewer (Notepad z.B.) zeigt auch noch Zeichen in einem anderen Code an.
    3. Am besten man speichert seine Zeichen mit nem Code ab, z.B. wenn man WideStrings benutzt so:

    std::wcout << L"Hallo, Sonderzeichen: \u00E4 und \u00FC";
    

    Dann ist es egal was der Sourcecode-Editor für ne Codierung verwendet. Das nachher der Viewer (Texteditor, Konsole usw.) das richtig anzeigt, ist eine andere Sache.
    4. Unter Windows sollte man die Konsole mit nem Unicode-Font nutzen, den Font kann man im Systemmenü des Fensters unter Eigenschaften umstellen.





  • ähm.. danke, das hab ich in meinem code schon lange so oO
    Aber das hat absolut nix mit meinem problem zu tun..
    trozdem danke 😉



  • .. eine frage hab ich noch, und ich möcht jetzt net iwelche möglichkeiten wege oder sonst was wissen, sondern nur "ja" oder "nein" ..
    Gibt es eine möglichkeit, das die umlaute und sonderzeichen korrekt eingelesen und in dem html code gespeichert werden?

    Mfg Max



  • Metaby schrieb:

    .. eine frage hab ich noch, und ich möcht jetzt net iwelche möglichkeiten wege oder sonst was wissen, sondern nur "ja" oder "nein" ..
    Gibt es eine möglichkeit, das die umlaute und sonderzeichen korrekt eingelesen und in dem html code gespeichert werden?

    Mfg Max

    ja



  • ok.. die wäre? ich kenn mich mit c++ noch nicht so gut aus, das is mein erstes programm.. also gibts ne "einfache" (was is in C++ schon einfach..) möglichkeit das zu realisieren? ich hab mir etwas überlegt.. aber ich weis nicht ob es geht.
    und zwar,
    erst wird ja der string eingegeben über getline(cin, input); // input is der string
    und dann wird er ja verarbeitet, würde es funktionieren, nach dieser eingabe, eine selbst geschriebene funktion aufzurufen, die die länge der strings ermittelt, dann jede array-stelle also input[0] input[1] usw.. mit den umlauten und "ß" vergleicht? über eine if, bzw else if abfrage, und sobald diese true ist, werden alle nachfolgenden stellen nach hintengeschoben das der hexcode darin platz hat, und dann der umlaut bzw das sonderzeichen gelöscht wird und da dann der hexcode hineingeschrieben wird? und das ganze, bis der string komplett geprüft ist,
    und danach wird der string erst weitergegeben.. würde das so in der art machbar sein?



  • Müsste schon gehen.



  • Metaby schrieb:

    ok.. die wäre? ich kenn mich mit c++ noch nicht so gut aus, das is mein erstes programm.. also gibts ne "einfache" (was is in C++ schon einfach..) möglichkeit das zu realisieren? ich hab mir etwas überlegt.. aber ich weis nicht ob es geht.
    und zwar,
    erst wird ja der string eingegeben über getline(cin, input); // input is der string
    und dann wird er ja verarbeitet, würde es funktionieren, nach dieser eingabe, eine selbst geschriebene funktion aufzurufen, die die länge der strings ermittelt, dann jede array-stelle also input[0] input[1] usw.. mit den umlauten und "ß" vergleicht? über eine if, bzw else if abfrage, und sobald diese true ist, werden alle nachfolgenden stellen nach hintengeschoben das der hexcode darin platz hat, und dann der umlaut bzw das sonderzeichen gelöscht wird und da dann der hexcode hineingeschrieben wird? und das ganze, bis der string komplett geprüft ist,
    und danach wird der string erst weitergegeben.. würde das so in der art machbar sein?

    Das wäre eine Möglichkeit.

    Hast du dir den post von pumuckl schon mal genauer angeschaut?

    pumuckl schrieb:

    Ich wuerd ne funktion schreiben die mittels string::find() und string::replace() due Umlaute im fertigen String sucht und dann durch die Maskierungen ersetzt.

    http://www.cplusplus.com/reference/string/string/



  • jo hab ich mir schon angeschaut, aber da muss ich noch etwas rumprobieren, das is "neu" für mich, mit dem find, replace usw.. 😉
    wie gesagt, bin anfänger ^^

    MFG Max



  • also, ich hab jetzt eine weile rumprobiert und nach lösungen gesucht,
    ich hab eine funktionierende funktion geschrieben, sie muss einfach nach jeder eingabe in einem string aufgerufen werden und in klammer muss der funktion der string büergeben werden der überprüft werden soll

    int StringCheck(string &input)
    {
    	unsigned int i = 0;
    	size_t sl = input.length();
    	for (i = 0; i < sl; i++)
    		{
    		char ae = '\x84';
    		char AE = '\x8e';
    		char oe = '\x94';
    		char OE = '\x99';
    		char ue = '\x81';
    		char UE = '\x9a';
    		char ss = '\xe1';
    		char temp = input[i];
    		if (temp == ae)
    			{
    			string ae = "&auml;";
    			input.erase(i,1);
    			input.insert(i,ae);
    			sl = sl + 5;
    			}
    		if (temp == AE)
    			{
    			string AE = "&Auml;";
    			input.erase(i,1);
    			input.insert(i,AE);
    			sl = sl + 5;
    			}
    		if (temp == oe)
    			{
    			string oe = "&ouml;";
    			input.erase(i,1);
    			input.insert(i,oe);
    			sl = sl + 5;
    			}
    		if (temp == OE)
    			{
    			string OE = "&Ouml;";
    			input.erase(i,1);
    			input.insert(i,OE);
    			sl = sl + 5;
    			}
    		if (temp == ue)
    			{
    			string ue = "&uuml;";
    			input.erase(i,1);
    			input.insert(i,ue);
    			sl = sl + 5;
    			}
    		if (temp == UE)
    			{
    			string UE = "&Uuml;";
    			input.erase(i,1);
    			input.insert(i,UE);
    			sl = sl + 5;
    			}
    		if (temp == ss)
    			{
    			string ss = "&szlig;";
    			input.erase(i,1);
    			input.insert(i,ss);
    			sl = sl + 6;
    			}
    		}
    	return 0;
    }
    

    bei mir funktioniert sie einwand frei, maskiert die äöü und ß schriftzeichen allerdings nur mit html codes, um in txt dateien zu schreiben oder sonstiges bringt diese funktion nichts,

    MFG Max


Anmelden zum Antworten