Umlaute einlesen



  • 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;
    }
    

    😕



  • Ganz einfach. Du machst folgendes:

    ...
    if(string[i] == 'a')
    {
       string[i] = 'a';
    }
    ...
    

    🙂

    Vielleicht verstehst du besser was ich meine, wenn du einfach mal nach deinen *_ein und *_aus mal folgendes aufrufst:

    printf("%d => %d\n", ae_ein, ae_aus);
    

    Du solltest die *_ein und *_aus übrigens besser als Konstanten definieren. (Also ein const davor schreiben oder sie als Präprozessormakros definieren.)



  • du meinst

    printf ("%c => %c",ae_ein,ae_aus);
    

    ich habs gemerkt, aber was muss ich ändern, das ist echt ein witz, aber ich steh im Moment echt irgendwie total auf der Leitung... 😡


Anmelden zum Antworten