UTF-8 File lesen und wieder schreiben,...

Alles rund um die Programmierung mit Qt
Antworten
Selur
Beiträge: 27
Registriert: 19. Juni 2008 22:07

UTF-8 File lesen und wieder schreiben,...

Beitrag von Selur »

Verwende folgende Methode um ein UTF-8 Text Dokument einzulesen:

Code: Alles auswählen

QString readAll(const QString fileName)
{
  QString input = removeQuotes(fileName);
  QFile file(fileName);
  if (!file.exists()) {
    return QString();
  }
  if (!file.open(QIODevice::ReadOnly)) {
    return QString();
  }
  QTextStream stream(&file);
  stream.setCodec("UTF-8");
  input = stream.readAll();
  file.close();
  return input;
}
und folgende Methode um es wieder, unter einem anderen Namen (und "\r\n" -> "\n" Ersetzung) zu schreiben:

Code: Alles auswählen

int saveTextTo(QString text, QString to)
{
  if (text.isEmpty()) {
    return -1;
  }
  text = text.replace("\r\n", "\n");
  QFile file(to);
  file.remove();
  if (file.open(QIODevice::WriteOnly | QIODevice::Text)) {
    QTextStream out(&file);
    out.setCodec("UTF-8");
    out << text.toUtf8();
    if (file.exists()) {
      file.close();
      return 0;
    }
  }
  return -2;
}
Das Problem ist, nur wenn ich das Dokument unter dem neuen Namen speichere und in einem Editor öffne wird es als ANSI und nicht als UTF-8 codiert angezeigt.

Weiß einer was hier schief läuft und wie man es fixen kann,.. ? (ist sicher was doofes, vor allem bin ich mir sicher das Problem vor ein paar Jahren schon mal gehabt zu haben und damals war es auch irgendeine Kleinigkeit die ich übersehen habe,..)

Cu Selur

Ps.: die ANSI Kodierung kommt vermutlich weil ich das Programm unter Windows laufen lasse, dachte aber eigentlich mit out.setCodec("UTF-8") würde ich UTF-8 als Kodierung setzen,..
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: UTF-8 File lesen und wieder schreiben,...

Beitrag von Christian81 »

nimm mal .toUtf8() weg - dafür hast du ja den QTextStream.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Selur
Beiträge: 27
Registriert: 19. Juni 2008 22:07

Re: UTF-8 File lesen und wieder schreiben,...

Beitrag von Selur »

ist leider immer noch ANSI, auch wenn ich statt out << text.toUtf8(); out << text; verwende :(
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: UTF-8 File lesen und wieder schreiben,...

Beitrag von Christian81 »

Dann machst Du irgendwo anders etwas falsch - aber mangels Testcase können wir nicht sehen wo.
Dieses Programm funktioniert wie es soll:

Code: Alles auswählen

#include <QCoreApplication>
#include <QTextStream>
#include <QFile>

int main(int argc, char **argv)
{
  QCoreApplication app(argc, argv);
  
  QFile fIn("in.txt");
  fIn.open(QIODevice::ReadOnly);
  QTextStream tsIn(&fIn);
  tsIn.setCodec("UTF-8");
  
  QString str = tsIn.readAll();
  
  QFile fOut("out.txt");
  fOut.remove();
  fOut.open(QIODevice::WriteOnly);
  QTextStream tsOut(&fOut);
  tsOut.setCodec("UTF-8");
  
  tsOut << str;  
  
  fIn.close();
  fOut.close();
  return 0;
}
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Selur
Beiträge: 27
Registriert: 19. Juni 2008 22:07

Re: UTF-8 File lesen und wieder schreiben,...

Beitrag von Selur »

Ich hab im .pro file sogar,..
CODECFORSRC = UTF-8
CODECFORTR = UTF-8
stehen,..
komisch ist auch, dass wenn ich selber Text im SourceCode schreibe und ihn über die write Methode ausgebe ich ein UTF-8 File erhalte.
Hab mal eine Beispiel Datei und den Output den ich bekomme angehängt,..

rufe meine Methoden dann wie folgt auf:

Code: Alles auswählen

QString content = FileHelper::readAll(inputFile);
QString out = inputFile;
out = out.remove(out.lastIndexOf("."), out.size());
out += ".bak";
ModelHelper::saveTextTo(content, out);
inputFile enhält den Pfad zum Inputdatei
ModelHelper&FileHelper sind ein paar Helperclassen die ich habe aus denen die Methoden die ich anfangs gepostet habe stammen,...

Cu Selur
Ps.: Hab auch noch eine Datei mit Chinesischen Zeichen angehängt,..
Dateianhänge
withChineseCharacters.zip
(501 Bytes) 260-mal heruntergeladen
Output.zip
(629 Bytes) 266-mal heruntergeladen
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: UTF-8 File lesen und wieder schreiben,...

Beitrag von Christian81 »

Mein Testcase funktioniert mit deiner Beispieldatei wie erwartet ohne Probleme
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Selur
Beiträge: 27
Registriert: 19. Juni 2008 22:07

Re: UTF-8 File lesen und wieder schreiben,...

Beitrag von Selur »

Grummel, nur warum klappt es dann bei mir nicht,.. ?
Wenn ich:

Code: Alles auswählen

QString content = FileHelper::readAll(inputFile);
QMessageBox::information(0, "Input", content);
QString out = inputFile;
out = out.remove(out.lastIndexOf("."), out.size());
out += ".bak";
ModelHelper::saveTextTo(content, out);
QString outputContent = FileHelper::readAll(out);
QMessageBox::information(0, "Output", outputContent);
vewendet, ist text in der ersten MessageBox noch richtig und in der 2ten total kaputt,..
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: UTF-8 File lesen und wieder schreiben,...

Beitrag von Christian81 »

Hast Du es endlich mal mit meinem Testprogramm probiert? Und wenn ja - hast Du meinen Code mal bei Dir verwendet? Da ich kein minimales kompilierbares Beispiel habe (und ich eines geliefert habe welches korrekt funktioniert) musst Du wohl mal ein wenig selbst grübeln und vergleichen was anders ist.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Selur
Beiträge: 27
Registriert: 19. Juni 2008 22:07

Re: UTF-8 File lesen und wieder schreiben,...

Beitrag von Selur »

Ja, hab ich, dein Beispiel Programm läuft bei mir ohne Probleme, sehe nur nicht den Unterschied zu meinen Methode,.. :/
-> liegt an der SchreibMethode, den Lese-Teil kann ich durch meine Methode ersetzen und es geht noch alles, beim Schreib-Teil kommt dann Unfug raus,.. :/
Werde berichten wenn ich raus habe woran es liegt.

Danke auf jeden Fall schon mal für die Hilfe:)
Selur
Beiträge: 27
Registriert: 19. Juni 2008 22:07

Re: UTF-8 File lesen und wieder schreiben,...

Beitrag von Selur »

Grummel, lag irgendwie am Compiler, bzw. den Aufräumroutinen in meinem Projekt, m_oc und object file wurden nicht ordentlich gelöscht, nach dem manuellen löschen ging es dann,... der erste Tipp von Dir mit dem entfernen von '.toUtf8()' hat dann geholfen,.. :shock:
Antworten