Wie Lesen/Schreiben von UTF8-text-Dateien in C?

ich versuche zu Lesen UTF8 text aus einer text-Datei, und drucken Sie dann etwas von ihm zu einer anderen Datei. Ich bin mit Linux und gcc-compiler. Dies ist der code den ich verwende:

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

int main(){
    FILE *fin;
    FILE *fout;
    int character;
    fin=fopen("in.txt", "r");
    fout=fopen("out.txt","w");
    while((character=fgetc(fin))!=EOF){
        putchar(character); //It displays the right character (UTF8) in the terminal
        fprintf(fout,"%c ",character); //It displays weird characters in the file
    }
    fclose(fin);
    fclose(fout);
    printf("\nFile has been created...\n");
    return 0;
}

Es funktioniert für englische Zeichen für jetzt.

  • Sie erkennen, dass UTF-8 ist eine Mehrbyte-Codierung, richtig? Einfügen von Leerzeichen zwischen jedem byte (fprintf- Anweisung) wird wahrscheinlich brechen, dass die Zeichencodierung in der Ausgabedatei.
  • Ich in der Regel mit wchar_t und wstring mit fwprintf (breites Zeichen) für persische Zeichen.
  • wenn fprintf bricht die Codierung, was sollte ich verwenden, anstatt fprintf schlagen Sie vor?
  • ich habe versucht, fwprintf, aber das Ergebnis war noch schlimmer. Kann fgetc() liest utf8?
  • "große Zeichen" sind zu 99% defekte in C (andere Compiler haben unterschiedliche Vorstellungen darüber, was ein wide-character ist). Am besten ist entweder laden Sie es als "raw uint8_t Byte" und es tun sich (wenn es eine einfache Sache), oder verwenden Sie eine anständige Internationalisierung Bibliothek (wenn es mehr als eine einfache Sache).
  • Haben Sie versucht, entfernen Sie den zusätzlichen Raum in Ihrem fprintf, wie vorgeschlagen von @ldav1s?
  • fprintf ist nicht das brechen der Codierung. Der format-string von fprintf im code ist das brechen der Codierung. Wenn Sie wollen fügen Sie ein Leerzeichen zwischen jedem Unicode-code-point Lesen (das ist das, was "Arbeit" für Englisch), Ihr code muss UTF-8 aware. Ein Weg, dies zu tun ist, um Puffer bis die bytes, die Sie Lesen, bis Sie einen code zeigen, dann fprintf(fout, "%s ", utf8cp); wo utf8cp ist char utf8cp[5]; Es ist 5 bytes lang sein, da UTF-8 Zeichen 1-4 Byte + beenden '\0'.
  • hast entweder die Antworten dir helfen? Wenn einer von Ihnen Tat, und beantwortete Ihre Frage, bitte akzeptieren Sie es. Andernfalls lassen Sie uns wissen, welche zusätzlichen Hilfe, die Sie benötigen, oder wenn Sie noch Probleme. Danke.
  • Danke @jpdurham. ich wollte den Wert in einer einzigen Variablen, so dass ich übergeben Sie es an verschiedenen Funktionen.

InformationsquelleAutor user2768374 | 2014-02-12
Schreibe einen Kommentar