Anzeige:
Ergebnis 1 bis 13 von 13

Thema: [C] Umlaute vergleichen

  1. #1
    Registrierter Benutzer Avatar von roadracer
    Registriert seit
    16.02.2010
    Ort
    Wolfenbüttel
    Beiträge
    48

    [C] Umlaute vergleichen

    Hallo,
    hab' ein kleines Problem mit Umlauten, und zwar: Ich will eine Datei zeichenweise auslesen, und prüfen ob das eingelesene Zeichen ein Umlaut ist. Das das so nicht funktioniert kann sich wohl jeder denken. Aber wie mache ich es richtig? Ich habe schon diese Seite gefunden http://www.cl.cam.ac.uk/~mgk25/unicode.html#linux nur werde ich ehrlich gesagt nicht so richtig schlau daraus. Gut, man soll einen anderen Zeichensatz verwenden, entweder den passenden Regionalen (bei mir also ISO 8859-1) oder UTF-8. Leider bekomme ich weder das eine noch das andere hin . Bitte also ein wenig vorkauen.
    Hier mein Code mit dem das funktionieren soll:
    Code:
    #include <stdio.h>
    
    int main () {
      FILE *input, *output;
      char c;
      /* Dateien öffnen, NULL-Pointer abfangen, zeichenweise aus *input mit fgetc einlesen.*/
      while ((c = fgetc (input)) != EOF) {
        if (c == 'ä')
          fprintf (output, "ae");
        else if (c == 'ö')
          fprintf (output, "oe");
        else if (c == 'ü')
          fprintf (output, "ue");
        else if (c == 'Ä')
          fprintf (output, "Ae");
        else if (c == 'Ü')
          fprintf (output, "Ue");
        else if (c == 'Ö')
          fprintf (output, "Oe");
        else
          fprintf (output, "%c", c);
      }
    /* ...*/
    }
    OpenSUSE 12.1 x86 KDE 4.7

    Alle Rechtschreibfehler unterliegen der GFDL und dürfen so oder in veränderter Form genutzt und weiter gegeben werden.

  2. #2
    Registrierter Benutzer
    Registriert seit
    05.08.2010
    Beiträge
    8
    Das Problem ist natürlich, dass ein Umlaut in UTF-8 mehr als ein Zeichen ist.
    Bei mir geht's zum Beispiel so (den String musst du natürlich durch deinen Input ersetzen)
    Code:
    #include <stdio.h>
    
    int main() {
    	char *str = "ö  ä  ü";
    	unsigned char * c = str;
    	do {
    		if (*c == -64) {
    			++c;
    			if (*c == -74)
    				printf ("oe");
    			else if (*c == -92)
    				printf ("ae");
    			else if (*c == -68)
    				printf ("ue");
    		} else {
    			putchar (*c);
    		}
    	} while (*(c++));
    }
    PS.: Ö -> -106; Ä -> -124; Ü -> -100
    Geändert von Der Franz (22-08-2010 um 00:05 Uhr) Grund: Großbuchstaben

  3. #3
    Registrierter Benutzer Avatar von jeebee
    Registriert seit
    01.01.2005
    Ort
    Bern || Zürich
    Beiträge
    540
    Dabei ist zu erwähnen, dass man nicht einen unsigned char mit einer negativen Konstante vergleichen sollte! Besser:
    Code:
    ... if(*c == 192) { ...
    usw. Die Umrechnung ist wie folgt: (signed char) -64 == (unsigned char) 128 + 64.
    my very own 128 bit integer
    C4 D3 B8 A8 9E A0 C6 EC 7D EC A8 15 28 D1 92 58
    more information

  4. #4
    Registrierter Benutzer
    Registriert seit
    05.08.2010
    Beiträge
    8
    Sry, es heißt doch -61.
    Aber mit 195 (256-61, weil negative Zahlen im Zweierkompliment dargestellt werden), geht's nicht. Mit 189 (128 + 61) übrigens auch nicht.

  5. #5
    Registrierter Benutzer Avatar von roadracer
    Registriert seit
    16.02.2010
    Ort
    Wolfenbüttel
    Beiträge
    48
    Entschuldigt die Frage, gibt es bei Zeigern einen Unterschied zwischen
    Code:
    char *c;
    char* c;
    char * c;
    ?

    Und was ist eigentlich
    Code:
    char **c
    ?
    Gibt es da auch irgendwelche Unterschiede?
    OpenSUSE 12.1 x86 KDE 4.7

    Alle Rechtschreibfehler unterliegen der GFDL und dürfen so oder in veränderter Form genutzt und weiter gegeben werden.

  6. #6
    Registrierter Benutzer Avatar von undefined
    Registriert seit
    01.03.2004
    Beiträge
    1.255
    Das erste ist eine C/C++ Glaubens frage in C schreibt man vor die Variable wobei man bei C++ dazu rät hinter die Deklaration zu schreiben.

    Link - Die erste Zeile sagt viel aus
    http://www.proggen.org/doku.php?id=cointer
    Geändert von undefined (22-08-2010 um 19:41 Uhr)
    mfg undefined
    --
    Undefined Behavior (undefiniertes Verhalten) bedeutet meistens etwas ungültiges.
    xhtml Debugger

  7. #7
    Registrierter Benutzer Avatar von jeebee
    Registriert seit
    01.01.2005
    Ort
    Bern || Zürich
    Beiträge
    540
    Also bei mir funktioniert der Code aus post #2 funktioniert bei mir auch nicht, ausser ich lasse das unsigned in Zeile 5 weg.

    edit: es lohnt sich wohl, für Unicode + C die GLib zu verwenden: http://library.gnome.org/devel/glib/...ipulation.html
    my very own 128 bit integer
    C4 D3 B8 A8 9E A0 C6 EC 7D EC A8 15 28 D1 92 58
    more information

  8. #8
    Registrierter Benutzer Avatar von roadracer
    Registriert seit
    16.02.2010
    Ort
    Wolfenbüttel
    Beiträge
    48
    Zitat Zitat von undefined Beitrag anzeigen
    Das erste ist eine C/C++ Glaubens frage in C schreibt man vor die Variable wobei man bei C++ dazu rät hinter die Deklaration zu schreiben.

    Link - Die erste Zeile sagt viel aus
    http://www.proggen.org/doku.php?id=cointer
    Weist'e Bescheid, Schätzelein!
    Okay danke, dann ist char * c; wohl ein Kompromiss.

    VG
    OpenSUSE 12.1 x86 KDE 4.7

    Alle Rechtschreibfehler unterliegen der GFDL und dürfen so oder in veränderter Form genutzt und weiter gegeben werden.

  9. #9
    Registrierter Benutzer Avatar von undefined
    Registriert seit
    01.03.2004
    Beiträge
    1.255
    Also bei der zweiten und dritten Variante würde ich dringend davon abraten das in C zu machen. Manche Compilern Interpretieren das ganz anders http://www.peacesoftware.de/ckurs12.html
    mfg undefined
    --
    Undefined Behavior (undefiniertes Verhalten) bedeutet meistens etwas ungültiges.
    xhtml Debugger

  10. #10
    Registrierter Benutzer Avatar von sommerfee
    Registriert seit
    02.07.2006
    Beiträge
    1.603
    Zitat Zitat von undefined Beitrag anzeigen
    Also bei der zweiten und dritten Variante würde ich dringend davon abraten das in C zu machen. Manche Compilern Interpretieren das ganz anders
    Welche? Mir ist bisher kein derart fehlerhaft implementierter C-Compiler begegnet.

    P.S.: Mein Tipp: http://madison-project.wikidot.com/l...g_Language.pdf

  11. #11
    Registrierter Benutzer Avatar von roadracer
    Registriert seit
    16.02.2010
    Ort
    Wolfenbüttel
    Beiträge
    48
    Zitat Zitat von jeebee Beitrag anzeigen
    [...]es lohnt sich wohl, für Unicode + C die GLib zu verwenden: http://library.gnome.org/devel/glib/...ipulation.html
    Danke, hört sich super an! Ich hab' mir das jetzt schon ein paar mal durchgelesen, und bin ich irgendwie 'n bissel zu dumm für UTF-8. Ich habe zwar Variablen-Typen für UTF-32 (gunichar) und UTF-16 (gunichar2) gefunden, aber keinen für UTF-8.

    VG
    OpenSUSE 12.1 x86 KDE 4.7

    Alle Rechtschreibfehler unterliegen der GFDL und dürfen so oder in veränderter Form genutzt und weiter gegeben werden.

  12. #12
    Registrierter Benutzer Avatar von roadracer
    Registriert seit
    16.02.2010
    Ort
    Wolfenbüttel
    Beiträge
    48
    Die Methode von Der Franz funktioniert auf jeden Fall unter Linux.
    Jetzt habe ich mich noch mal an eine "saubere" Variante mit wild characters versucht, aber irgendwie will mein System (Siehe Signatur) die nicht anzeigen. wprintf gibt als Rückgabe wert immer -1 zurück: Fehler.
    Ich habe schon mal dieses kleine Beispiel Programm von der Seite hier http://www.wolf4you.de/doku/qr/c/printfexamples.htm laufen lassen, aber alles was mit wprintf ist wird einfach nicht angezeigt.
    Code:
    #include <stdio.h>
    
    void main( void )
    {
       char   ch = 'h', *string = "computer";
       int    count = -9234;
       double fp = 251.7366;
       wchar_t wch = L'w', *wstring = L"Unicode";
    
       /* Display integers. */
       printf( "Integer formats:\n"
               "\tDecimal: %d  Justified: %.6d  Unsigned: %u\n",
               count, count, count, count );
    
       printf( "Decimal %d as:\n\tHex: %Xh  C hex: 0x%x  Octal: %o\n",
                count, count, count, count );
    
       /* Display in different radixes. */
       printf( "Digits 10 equal:\n\tHex: %i  Octal: %i  Decimal: %i\n",
                0x10, 010, 10 );
    
       /* Display characters. */
    
       printf("Characters in field (1):\n%10c%5hc%5C%5lc\n", ch, ch, wch, wch);
       wprintf(L"Characters in field (2):\n%10C%5hc%5c%5lc\n", ch, ch, wch, wch);
    
       /* Display strings. */
    
       printf("Strings in field (1):\n%25s\n%25.4hs\n\t%S%25.3ls\n",
       string, string, wstring, wstring);
       wprintf(L"Strings in field (2):\n%25S\n%25.4hs\n\t%s%25.3ls\n",
           string, string, wstring, wstring);
    
       /* Display real numbers. */
       printf( "Real numbers:\n\t%f %.2f %e %E\n", fp, fp, fp, fp );
    
       /* Display pointer. */
       printf( "\nAddress as:\t%p\n", &count);
    
       /* Count characters printed. */
       printf( "\nDisplay to here:\n" );
       printf( "1234567890123456%n78901234567890\n", &count );
       printf( "\tNumber displayed: %d\n\n", count );
    }
    VG roadracer
    OpenSUSE 12.1 x86 KDE 4.7

    Alle Rechtschreibfehler unterliegen der GFDL und dürfen so oder in veränderter Form genutzt und weiter gegeben werden.

  13. #13
    Registrierter Benutzer Avatar von roadracer
    Registriert seit
    16.02.2010
    Ort
    Wolfenbüttel
    Beiträge
    48
    Lösung gefunden. Man darf auf den jeweiligen Stream nur mit Wide-character- oder Multibyte-Funktionen zugreifen.
    Also entweder nur printf oder nur wprintf!
    OpenSUSE 12.1 x86 KDE 4.7

    Alle Rechtschreibfehler unterliegen der GFDL und dürfen so oder in veränderter Form genutzt und weiter gegeben werden.

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •