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 vonfprintf
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, dannfprintf(fout, "%s ", utf8cp);
woutf8cp
istchar 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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Statt
verwenden
Zweiten
fprintf()
enthält keine Leerzeichen nach%c
das ist, was verursacht wurde out.txt zu display komische Zeichen. Der Grund dafür ist, dassfgetc()
abgerufen wird ein einzelnes byte (das gleiche wie ein ASCII-Zeichen), nicht eine UTF-8-Zeichen. Da UTF-8 auch ASCII-kompatibel, es wird Englisch schreiben Zeichen in die Datei just fine.putchar(character)
Ausgabe der bytes nacheinander ohne das zusätzliche Leerzeichen zwischen jedem byte so die ursprüngliche UTF-8-Sequenz intakt geblieben. Um zu sehen, was ich spreche, versuchenWenn Sie möchten, schreiben UTF-8-Zeichen mit den Leerzeichen dazwischen zu out.txt Sie würde behandeln müssen, dass die variable-Länge-Kodierung von UTF-8-Zeichen.
Dieser code war für mich:
Wenn Sie nicht möchten, um die breiten Möglichkeiten, Experimentieren Sie mit den folgenden:
Lesen und schreiben von bytes, nicht in Zeichen.
Auch bekannt als, mit binären, nicht als text.
fgetc effektiv wird ein byte aus einer Datei, aber wenn das byte ist größer als 127 ist, versuchen Sie und behandeln Sie es als ein int statt char.
fputc, auf der anderen Seite ignoriert indem ein char > 127. Es wird funktionieren, wenn Sie ein int anstatt char als Eingang.
Auch im offenen Modus, versuchen Sie, mit binären, und so versuchen, rb & wb eher als r & w
Den C-style-Lösung ist sehr aufschlussreich, aber wenn man bedenkt, würde mit C++ wird die Aufgabe viel mehr high-level, und Sie müssen nicht so viel wissen über utf-8-Codierung. Betrachten Sie das folgende: