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



  • @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