ö, ä, ü usw.. in strings einlesen und abspeichern
-
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.
-
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 sollint 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 = "ä"; input.erase(i,1); input.insert(i,ae); sl = sl + 5; } if (temp == AE) { string AE = "Ä"; input.erase(i,1); input.insert(i,AE); sl = sl + 5; } if (temp == oe) { string oe = "ö"; input.erase(i,1); input.insert(i,oe); sl = sl + 5; } if (temp == OE) { string OE = "Ö"; input.erase(i,1); input.insert(i,OE); sl = sl + 5; } if (temp == ue) { string ue = "ü"; input.erase(i,1); input.insert(i,ue); sl = sl + 5; } if (temp == UE) { string UE = "Ü"; input.erase(i,1); input.insert(i,UE); sl = sl + 5; } if (temp == ss) { string ss = "ß"; 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.
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. :pCheck 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, "ä" ) ) return 1; break; case 'Ä': if( Putstr( fp, "Ä" ) ) return 1; break; case 'ö': if( Putstr( fp, "ö" ) ) return 1; break; case 'Ö': if( Putstr( fp, "Ö" ) ) return 1; break; case 'ü': if( Putstr( fp, "ü" ) ) return 1; break; case 'Ü': if( Putstr( fp, "Ü" ) ) return 1; break; case 'ß': if( Putstr( fp, "ß" ) ) 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. :pDa haddu recht. Aber ein C++-Code wäre trotzdem schöner gewesen.