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



  • 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



  • @Metaby

    Selbstverständlich kannst du mit deiner Funktion auch in Textdateien schreiben, wenn du statt der HTML-Maskierung einfach den Code des anderen Zeichensatzes hinschreiben lässt.

    @evilissimo

    Der Artikel in der FAQ scheint mir nicht ganz richtig.

    Deutsche Umlaute werden in der Win32-Konsole falsch angezeigt. Der Grund dafür sind Zeichensatz-Inkompatibilitäten. Während man während der Programmierung zumeist den ASCII-Zeichensatz verwendet, wird in der Konsole mit einem ANSI-Zeichensatz gearbeitet.

    Ist es nicht eher so, dass in der Konsole mit ASCII und entsprechender Ländererweiterung gearbeitet wird und während der Programmierung (also z.B. in einem Windows-Editor) mit ANSI?



  • oO ok stimmt.. da hab ich jetzt net dran gedacht, is mir aber ehrlichgesagt auch egal, weil ich die funktion wegen html maskierungen geschrieben habe, da ich sie für mein programm brauche 😉

    aber danke für den tipp

    MFG Max



  • Hi Bruder !
    Die ganzen string replacements sind doch Tinnef. Wenns sowieso in eine Datei rein soll, dann gleich rein damit und nicht erst in irgendwelchen strings rumwühlen. :p

    Check this out:

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    const char* html_header = "<html><body>\n";
    const char* html_footer = "\n</html></body>";
    const LineLength = 80;
    
    int Perr( const char* msg )
    {
    	perror( msg );
    	return 1;
    }
    
    int Err( const char* msg )
    {
    	fprintf( stderr, "%s\n", msg );
    	return 1;
    }
    
    int ErrExit( FILE* fp, const char* msg )
    {
    	fprintf( stderr, "%s\n", msg );
    	if( fp ) fclose(fp);
    	exit(1);
    }
    
    int ErrClose( FILE* fp )
    {
    	if( fp ) fclose(fp);
    	return 1;
    }
    
    int Putstr( FILE* fp, const char* s )
    {
    	fprintf( fp, "%s", s );
    	if ( ferror(fp) ) return 1;
    	return 0;
    }
    
    int Putchar( FILE* fp, const char c )
    {
    	fprintf( fp, "%c", c );
    	if ( ferror(fp) ) return 1;
    	return 0;
    }
    
    int Entities( FILE* fp, const char* s )
    {
    	if ( !fp || !s ) return ErrExit( fp, "pfui!" );
    
    	while(*s)
    	{
    		switch(*s)
    		{	
    			case 'ä':
    				if( Putstr( fp, "&auml;" ) ) return 1;
    			break;
    
    			case 'Ä':
    				if( Putstr( fp, "&Auml;" ) ) return 1;
    			break;
    
    			case 'ö':
    				if( Putstr( fp, "&ouml;" ) ) return 1;
    			break;
    
    			case 'Ö':
    				if( Putstr( fp, "&Ouml;" ) ) return 1;
    			break;
    
    			case 'ü':
    				if( Putstr( fp, "&uuml;" ) ) return 1;
    			break;
    
    			case 'Ü':
    				if( Putstr( fp, "&Uuml;" ) ) return 1;
    			break;
    
    			case 'ß':
    				if( Putstr( fp, "&szlig;" ) ) return 1;
    			break;
    
    			default:
    				if( Putchar( fp, *s ) ) return 1;
    		}
    		s++;
    	}
    	return 0;
    }
    
    FILE* Open( const char* file, const char* mode )
    {
    	return fopen( file, mode );
    }
    
    int Close( FILE* fp )
    {
    	if( fclose( fp ) )
    		return Perr(NULL);
    	return 0;
    }
    
    int main( int argc, char* argv[] )
    {
    	FILE* fp = NULL;
    	int i = 0;
    	int len = 0;
    
    	if( argc < 3 )	return Err( "Usage: program htmlfile content\n" );
    
    	if( NULL == ( fp = Open( argv[1], "wt" )))	return Perr( argv[1] );
    
    	if( Putstr( fp, html_header ) ) return ErrClose( fp );
    
    	for( i=2; i<argc; i++ )
    	{
    		// Todo: Bessere Zeilentrennung. Entities verlängern Wortlänge, daher
    		//		 ist eine Überschreitung der mit LineLength eingestellten
    		//		 Zeilenlänge möglich, bei html Dateien aber nicht unbedingt relevant.
    		if( ( len + strlen( argv[i] ) ) > LineLength ) 
    		{
    			if( Putchar( fp, '\n' ) ) return ErrClose( fp );
    			len = 0;
    		}
    
    		len += strlen( argv[i] );
    		if( Entities( fp, argv[i] ) ) return ErrClose( fp );
    		if( Putchar( fp, ' ' ) ) return ErrClose( fp );
    	}
    
    	if( Putstr( fp, html_footer ) ) return ErrClose( fp );
    	if( Close( fp ) ) return 1;
    
    	return 0;
    }
    

    🕶



  • CoDiNg WaRrIoR schrieb:

    Hi Bruder !
    Die ganzen string replacements sind doch Tinnef. Wenns sowieso in eine Datei rein soll, dann gleich rein damit und nicht erst in irgendwelchen strings rumwühlen. :p

    Da haddu recht. Aber ein C++-Code wäre trotzdem schöner gewesen. 😉


Anmelden zum Antworten