Hinweis: Das Forum wird geschlossen! Neue Registrierungen sind nicht mehr möglich!

 Zurück zu Pro-Linux   Foren-Übersicht   FAQ     Suchen    Mitgliederliste
Umlaute konvertieren

 
Neuen Beitrag schreiben   Auf Beitrag antworten    Pro-Linux Foren-Übersicht -> Programmieren - C
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
tobi_odi



Anmeldungsdatum: 30.12.2003
Beiträge: 18
Wohnort: Dresden

BeitragVerfasst am: 30. Jun 2005 21:57   Titel: Umlaute konvertieren

Ist eine Schwierigkeit überwunden, schon kommt das nächste Problem um die Ecke.

Ich möchte alle Umlaute in einer Datei für TeX in \"a; \"u; ... und so weiter mit einem C-Programm konvertieren.
Ich habe versucht das einzelne Zeichen als int mit switch() zu nutzen. Leider haben die Umlaute mehrere int Werte, so daß ich die Umlaute zwar herauslesen aber keine weitere Unterteilung machen kann. Wie kann ich auf die weiteren Werte zugreifen?

Zum testen habe ich mir eine Textdatei mit einigen Umlaute erstellt und sie mit dem folgenden Programm aufgerufen.

Code:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
   if(argc < 2)
   return 2;
        char *file1 = argv[1];
        int i=0, c;
   FILE *fp1;
        if((fp1=fopen(file1,"r")) == NULL )
        {
      printf("zu lesende Datei %s nicht gefunden!\n", file1);
      return 11;
   }
   while((c=fgetc(fp1))!=EOF)
   {
      printf("%i %c\n",c,c);
      switch(c)
      {
         case 195:
            {
//??? Hier moechte ich gern auf den zweiten Wert zugreifen ???
               switch (c)
               {
                  case 164: printf("\"a");
                       break;
                  case 132: printf("\"A");
                            break;
                  // und so weiter
               }
            }
            break;
         default:printf("%c",c);
            break;   
      }   
   }
      
   if (!fclose(fp1))
   printf("Datei %s erfolgrein geschlossen!\n",file1);
   return 1;
   
}


Gruß tobi
 
Benutzer-Profile anzeigen Private Nachricht senden

kaskadus
Gast





BeitragVerfasst am: 30. Jun 2005 23:35   Titel:

Zitat:
Leider haben die Umlaute mehrere int Werte

Question Es gibt den ANSI-Zeichensatz und den so genannten erweiterten Dos-Zeichensatz, die hier wohl wichtig sind.

Ä = C4 = 196 Ansi
Ä = 8E = 142 Dos-erw.

Richtige Tabellen suchen.
Unter Linux kannst du ANSI nehmen, für Windows-Konsole Dos-erw.

Im Internet gibt es da zuhauf Infos drüber.
 

Lateralus
prolinux-forum-admin


Anmeldungsdatum: 05.05.2004
Beiträge: 1238

BeitragVerfasst am: 01. Jul 2005 6:24   Titel:

Hi

Ich denke mal, dass von UTF-8 die Rede ist, aber erstmal zu deinem Programm:

Dein Problem wird sein, dass du - wenn du mit getc ein neues Zeichen vor dem zweiten switch einliest - dieses Zeichen, welches ja auch ein potentielles 195 ist, verwirfst. Ein Lsg. dafür ist, zwei Funktionen getch und ungetch zu schreiben, welche das Zeichen nach Bedarf zurückstellen. (Die Idee kommt aus "Programmieren in C").

Code:
#include <stdio.h>
#include <stdlib.h>

#define BUFSIZE  20

int buf[BUFSIZE];
int buf_index=0;

int getch(FILE *fp){
  if( buf_index == 0)
    return getc(fp);
  else{
      return buf[buf_index];
      buf_index--;
   }

}

void ungetch(int c){
   if( buf_index >= BUFSIZE )
      fprintf(stderr, "Zeichen konnte nicht zurueckgestellt werden!\n");
   else{
      buf[buf_index] = c;
      buf_index++;
   }

}

int main(int argc, char **argv)
{
   if(argc < 2)
   return 2;
        char *file1 = argv[1];
        int i=0, c, oldc;
   FILE *fp1;
        if((fp1=fopen(file1,"r")) == NULL )
        {
      printf("zu lesende Datei %s nicht gefunden!\n", file1);
      return 11;
   }
   /* Wir benutzen getch: */
   while((c=getch(fp1))!=EOF)
   {
      printf("%i %c\n",c,c);
      oldc = c; /* Dies nur für den Fall, dass Switch mehrmals c liest, was ich nicht glaube  */
      switch(oldc)
      {
         case 195:
            {
//??? Hier moechte ich gern auf den zweiten Wert zugreifen ???
/* Na dann los!: */
               c = getch(fp1);
               switch (c)
               {
                  case 164: printf("\"a");
                       break;
                  case 132: printf("\"A");
                            break;
                  // und so weiter
         default: ungetch(c);
         break;
               }
            }
            break;
         default:printf("%c",c);
            break;   
      }   
   }
     
   if (!fclose(fp1))
   /* Den Schreibfehler könntest du mal korrigeren ;-) */
   printf("Datei %s erfolgrein geschlossen!\n",file1);
   return 1;
   
}


So müsste es, denke ich funktionieren, auch wenn man das sicher noch schöner machen kann. Aber hasst du mal an ein awk-Skript gedacht? (Das funktioniert nur, wenn dir die Zeichen in der Shell korrekt ausgegeben werden.

Code:
cat file | awk ' { gsub("Ä", "\"A"); gsub("ä", "\"a"); [...] print;  } ' > file.new


Würde dir file in file.new schreiben und dabei die Änderung vornehmen.
 
Benutzer-Profile anzeigen Private Nachricht senden

tobi_odi



Anmeldungsdatum: 30.12.2003
Beiträge: 18
Wohnort: Dresden

BeitragVerfasst am: 07. Jul 2005 16:06   Titel: Vielen Dank für eure Tips, vor allem für den Einsatz von Lateralus !!!

Meine Konvertierung funktioniert perfekt.

Leider habe ich es noch nicht entgültig verstanden warum.
Wann wird der Wert buf_index vor dem Aufruf von getch mit einem Wert ungleich 0 gesetzt?

Gruß tobi
 
Benutzer-Profile anzeigen Private Nachricht senden

Lateralus
prolinux-forum-admin


Anmeldungsdatum: 05.05.2004
Beiträge: 1238

BeitragVerfasst am: 12. Jul 2005 20:16   Titel:

Hi

buf_index wird nur von getch und ungetch benutzt und wird nur dann erhöht, wenn ungetch aufgerufen wird. Dies ist dann der Fall, wenn das auf 195 folgende Zeichen nicht 164 oder 132 entspricht. Hier das Code-Stück (auf default achten):

Code:

         case 195:
            {
//??? Hier moechte ich gern auf den zweiten Wert zugreifen ???
/* Na dann los!: */
               c = getch(fp1);
               switch (c)
               {
                  case 164: printf("\"a");
                       break;
                  case 132: printf("\"A");
                            break;
                  // und so weiter
         default: ungetch(c);
         break;
               }
            }
 
Benutzer-Profile anzeigen Private Nachricht senden

Beiträge vom vorherigen Thema anzeigen:   
     Pro-Linux Foren-Übersicht -> Programmieren - C Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehen Sie zu:  

Powered by phpBB © phpBB Group
pro_linux Theme © 2004 by Mandaxy