Unerwünschte Zeichen beim Erstellen/Kopieren von Datei



  • Hallo,

    Ich habe ein Problem mit einem Programm welches eine Datei auf Umlaute und Umbrüche prüfen soll und diese durch eine Zeichenkette für LaTeX ersetzen soll.
    Es funktioniert soweit alles, nur es tritt ein Fehler auf den ich nicht beheben kann.

    Hier habe ich ein Ähnliches Problem gefunden:
    http://www.c-plusplus.net/forum/308242-full
    bei mir funktioniert die Lösung mit fputc() aber nicht. Getestet im Code Zeile 10.

    Funktion:
    Inhalt Datei: Föhn
    SOLL in Datei 2: F\"ohn, IST aber FÃ\"ohn.

    Die Umbrüche werden wie erwartet korrekt ersetzt.

    int text2TEX(FILE *in) {
      FILE *n;
      char c;
    
      n=fopen("newfile.txt","w");
    
      while((c=getc(in))!=EOF) {
        switch (c) {
          case 10: fprintf(n,"\\\\\n"); break;
          case -92: fputc('\\',n);fputc('\"',n);fputc('a',n); break;
          case -124: fprintf(n,"\\\"A"); break;
          case -68: fprintf(n,"\\\"u"); break;
          case -100: fprintf(n,"\\\"U"); break;
          case -74: fprintf(n,"\\\"o"); break;
          case -106: fprintf(n,"\\\"O"); break;
          default: fputc(c,n);
        }
      }
    
      printf("Datei erstellt.\n");
      fclose(n);
      return 0;
    }
    

    Vielen Dank 🙂



  • du musst die anführungszeichen auch mit dem backslash maskieren.
    außerdem solltest du einen passenden formatspecifier verwenden, sauberer ist das.



  • Ist deine Input-Datei evtl UTF-8 codiert?

    c muss ein int sein, sonst bekommst du Probleme mit dem EOF.
    Nimm lieber fputs statt fprintf. fputs wertet den String nicht als Formatstring aus.

    solutionat0r schrieb:

    du musst die anführungszeichen auch mit dem backslash maskieren.

    Da sind drei \ . Der dritte ist für die Anführungszeichen.



  • ja, die Input Datei ist UTF-8 kodiert.
    Was ändert das an dem ganzen, wäre das nicht nur ein Problem, wenn er die Umlaute nicht finden würde? (Ich habe davon nicht so viel Ahnung)

    Wenn ich c als Int deklariere, dann findet er keine Umlaute mehr, die Schleife läuft auch als Char ohne Warnung und ohne Fehler (beim kompilieren und ausführen).



  • Dann lies dir mal den Wikipediaartikel zu UTF-8 durch.

    Der zweite und dritte Absatz erklären schon mal dein Problem.

    Wenn du c als int definierst, haben die Umlaute auch keine negativen Werte mehr.



  • Okay, danke schonmal, ich habe den Artikel gelesen und c jetzt als Int definiert und die Werte angepasst.

    Die Ausgabe hat sich geändert: Länge -> LÀnge statt vorher LÃ\"ange. Was ich jetzt wiederum gar nicht verstehe weil ich es ja mit 3 fputc() erzeuge.



  • Das à gennzeichnet ein UTF-8 Zeichen.
    Das wird ja noch über den default-Zweig kopiert.
    Da de \ aber kein erweitertes Zeichen ist (er ist in den 128 Standardzeichen enthalten) muss das à an der Stelle weg.



  • Da konnte ich jetzt nicht ganz folgen:

    Der default-Zweig wird nur ausgeführt wenn kein anderer aktiv war (break;). Also wird à schon vorher kopiert, bevor er die fputc() Befehle ausführt. Dabei weiß ich nicht woher das à überhaupt kommen soll.
    Der char vor dem ä ist ein L, also puttet er ein L (default), dann guckt er den nächsten char an (ä) und puttet \, ", a. der default-Zweig wird doch nicht mehr angerührt.


  • Mod

    jkalinka schrieb:

    Der char vor dem ä ist ein L, also puttet er ein L (default), dann guckt er den nächsten char an (ä) und puttet \, ", a. der default-Zweig wird doch nicht mehr angerührt.

    ä in UTF-8 ist aber kein char mit irgendeinem Wert, sondern ein Multibytezeichen. Konkret: Zwei chars, der erste 'Ã' (Hex 0xC3), der zweite '¤' (Hex 0xA4).

    Wie DirkB schon sagte: Guck dir nochmal an, wie UTF-8 funktioniert. das scheinst du noch nicht verstanden zu haben.

    P.S.: Falls du es noch nicht kennen solltest: Für dein Problem haben die LaTeX-Götter schon vor laaaanger Zeit das Paket inputenc erfunden. Sehr nützlich.



  • Und schau dir die Datei mal mit eienm Hexeditor oder Hexviewer an, dann siehst du die Zeichen.
    Evtl kann auch deine Entwicklungsumgebung ein Hexview machen.



  • Okay es funktioniert jetzt 🙂 danke für die Hilfe!

    Ich habe jetzt mit Ghex mir die Datei angesehen und konnte so den Wert für das à noch herausfinden und nun rausfiltern.

    P.S.: Falls du es noch nicht kennen solltest: Für dein Problem haben die LaTeX-Götter schon vor laaaanger Zeit das Paket inputenc erfunden. Sehr nützlich.

    Ich habe ein halbes Jahr Übungsaufgaben programmiert, ich will jetzt endlich mal was nützliches aus den Kenntnissen machen. Aber danke für den Tipp ;).


Anmelden zum Antworten