Umlaute einlesen
-
Hallo, im Moment lese ich einen String mit fgets ein, aber leider werden da keine Umlaute eingelesen... Muss ich mir da eine eigene Funktion zum Einlesen basteln oder wie? Jetzt verweist mich nicht auf die Konsolen FAQ, dort habe ich schon geschaut, aber das was dort steht bezieht sich ja nur auf die Ausgabe, und die hab ich inzwischen hingekriegt, aber wie lese ich Umlaute ein? Ach ja, ich progge in C!
-
Lasst mich doch nicht im STich Leute, oder gibts dafür keine Lösung???
-
Wie wärs mit getline() ?
-
aber das löst ja auch nicht das Umlaut Problem oder, außerdem progge ich in c? Wenn der User z.B.
"ä" eingibt, wird in dem String z.B. "+" gespeichert, ich will aber dass ä gespeichert wird. Man soll in dem Programm Dateien öffnen können und da ist es natürlich blöd, wenn man keine Dateinamen eingeben kann, die Umlaute enthalten!
-
MasterCounter schrieb:
aber das löst ja auch nicht das Umlaut Problem oder, außerdem progge ich in c? Wenn der User z.B.
"ä" eingibt, wird in dem String z.B. "+" gespeichert, ich will aber dass ä gespeichert wird. Man soll in dem Programm Dateien öffnen können und da ist es natürlich blöd, wenn man keine Dateinamen eingeben kann, die Umlaute enthalten!Ich schätze, dass doch ein ä gespeichert wird und einfach nur ein + ausgegeben wird. Das liegt einfach daran, dass es verschiedene Zeichensätze gibt. Die normalen Buchstaben und Zahlen haben den gleichen ASCII-Wert, Sonderzeichen, wie die Umlaute, allerdings nicht!
So, was jetzt wichtig ist, um dein Problem zu lösen:
1. Von wo liest du mit fgets()? Von einer Datei oder von der Tastatur?
2. Wenn du von einer Datei liest, mit welchem Editor schreibst du in die Datei?
3. Für welches OS compilierst du? Win32 oder 16Bit-DOS? (Welcher Compiler?)Kann dein Programm den eingelesenen Dateinamen nicht öffnen oder vermutest du das, weil bei der Ausgabe des Dateinamens ein + drinsteht?
Außerdem!
Unter neueren Betriebssystemen ist es zwar möglich, Sonderzeichen in einen Dateinamen aufzunehmen. Allerdings sollte man immer bedenken, ob das wirklich so gut bzw. sinnvoll ist. Du siehst ja jetzt welche Probleme das machen kann.
-
mit fgets lese ich von der tastatur
Ich mache das als Konsolenprogramm also Win32
Der User soll da einen Pfad/Dateinamen eingeben. Heißt er jetzt z.B. Köninger mit Nachnamen, so wie ich und seine Datei liegt unter
C:\Dokumente und Einstellungen\Köninger\Desktop\...
dann bringt mir FindFirstFile einen Fehler, weil er den Ordner nicht finden kann, zu Testzwecken habe ich mal den Ordner Koeninger unter
"Dokumente und Einstellungen" erstellt, um zusehen ob es an den Leerzeichen liegt, liegt es nicht, da er dort Dateien mit FindFirstFile gefunden hat. Es kann also nur an den Umlauten liegen!
-
dann mach einfach eine kurze routine ka z.b. ascii2deutsch (char* text)
in der du einfach jegliche Ascii-Zeichen nach versteckten Umlauten durchsuchst und ersetzt. Sind ja nur 6 Umlaute.
-
und wie erkenn ich die umlaute?
-
hab die hex codes jetzt in der faq gefunden.... muss ich da noch was beachten wenn ich ein char zeichen mit einer hex zahl vergleiche? wie vergleiche ich überhaupt irgendwas mit hex-zahlen?
-
wie vergleichst du int-zahlen?
-
MasterCounter schrieb:
hab die hex codes jetzt in der faq gefunden.... muss ich da noch was beachten wenn ich ein char zeichen mit einer hex zahl vergleiche? wie vergleiche ich überhaupt irgendwas mit hex-zahlen?
"Hex-Zahlen" sind auch nur Zahlen. Genau genommen ist es einfach nur eine Darstellungsform einer Zahl. Wenn du z. B. die Zahl 10 (dezimal) hast, dann ist das in hexadezimal ein A, in octal aber eine 12. Egal wie du es auch schreibst, der Wert ist immer der selbe ;).
-
das ist schon klar, aber wie unterscheidet er jetzt, ob ich 12 dezimal oder oktal meine
-
MasterCounter schrieb:
das ist schon klar, aber wie unterscheidet er jetzt, ob ich 12 dezimal oder oktal meine
Anhand deiner Formatierung. Mein Beispiel vom vorherigen Post in C.
x = 10; //dezimal y = 0xA; //hexadezimal printf("dezimal: x = %d, y = %d\n", x, y); printf("hexadezimal: x = %x, y = %x\n", x, y);
Wie du siehst, wenn du den Code in ein kleines Programm einbaust, compilierst und ausführst, steht in x und y genau das gleiche drin.
-
Aha, also 0x davor schreiben... hättest du auch gleich sagen können. Naja, es wird, es wird
Aber für mein Problem muss ich mir ja ne eigene Einlesefunktion basteln oder?
-
Aber irgendwie geht das doch nicht, ich dreh noch durch... Wenn ich folgendes Grundgerüst habe:
char ReadChar () { char c; c=getch(); if (c==umlaut) { ... und dann :confused: } return c; }
Was soll ich da dann machen?
-
Du musst natürlich wissen, welchen ASCII-Wert du einliest und welcher es dann eigentlich sein sollte.
Beispiel:
const unsigned char ae_ein = 100; const unsigned char ae_aus = 125; ... //Funktion zum Einlesen char * einlesen(char * eingabe, unsigned int max_lang) { ... unsigned char zeichen; char * pos = eingabe; ... //Zeichen einlesen zeichen = getch(); //Wenn der Umlaut ä eingelesen wird if(zeichen == ae_ein) { //Zeichen umsetzen auf "richtigen" Wert zeichen = ae_aus; } ... //gelesenes Zeichen in den Eingabepuffer schreiben *pos++ = zeichen; ... //Adresse des Eingabepuffers zurückliefern return(eingabe); }
Du könntest die Eingabe aber auch komplett einlesen lassen von fgets() und danach über mit einer Schleife Zeichen für Zeichen durchgehen und schauen, ob da Umlaute drin sind, die umgesetzt werden müssen.
Wie du es machst, bleibt dir überlassen.
-
aha, ok, aber woher weiß ich welchen wert ae_ein hat?
-
MasterCounter schrieb:
aha, ok, aber woher weiß ich welchen wert ae_ein hat?
Mach dir ein kleines Programm, mit dem du ein Zeichen von der Tastatur einliest und lass dir den Wert ausgeben:
... zeichen = getche(); printf(" = %d\n", zeichen); ...
-
oh ne, na klar hab ich hier sogar mal eins gemacht... heut ist echt nicht mein tag...
danke dir, auch wenns ne schwere geburt war
-
Warum funktioniert diese Funktion hier nicht?
char* ConvUmlaute (char *string) { int i=0; int len=0; int ae_ein=-124; int oe_ein=-108; int ue_ein=-127; int AE_ein=-114; int OE_ein=-103; int UE_ein=-102; int ss_ein=-31; unsigned char ae_aus=132; unsigned char oe_aus=148; unsigned char ue_aus=129; unsigned char AE_aus=142; unsigned char OE_aus=153; unsigned char UE_aus=154; unsigned char ss_aus=225; len=strlen(string); i=0; while (i<=len) { if (string[i]==ae_ein) string[i]=(char)ae_aus; else if (string[i]==ue_ein) string[i]=(char)ue_aus; else if (string[i]==oe_ein) string[i]=(char)oe_aus; else if (string[i]==AE_ein) string[i]=(char)AE_aus; else if (string[i]==UE_ein) string[i]=(char)UE_aus; else if (string[i]==OE_ein) string[i]=(char)OE_aus; else if (string[i]==ss_ein) string[i]=(char)ss_aus; i++; } return string; }