Unicode von Datei laden und abspeichern

Verschiedenes zu Qt
Antworten
Amgon
Beiträge: 7
Registriert: 26. September 2009 20:00

Unicode von Datei laden und abspeichern

Beitrag von Amgon »

Hallo,

mein Texteditor nimmt langsam gestalt an und konnte bisher auch alle gängigen Dateien öffnen. Ich benutze eine Ableitung von QPlainTextEdit als centralWidget.

Doch wenn ich versuche, eine UTF-8-Datei darin zu öffnen, erscheint ein "" am Anfang der Datei (BOM vermute ich?) und alle Zeichen, die nicht über die ersten 128 ASCII-Einträge hinausgehen, werden ebenfalls richtig angezeigt. Aber Sonderzeichen (» usw.) werden eben als Fragezeichen oder als ganz komische Buchstaben-Kobination dargestellt.

Verstanden habe ich, dass man die ersten Bytes auf EF BB BF prüfen muss, um eventuell eine UTF-8 Datei zu erkennen.

Aber bei der Umsetzung im Editor hört es auf. Der Editor soll ja nicht nur UTF-8, sondern auch den normalen ISO-Zeichensatz darstellen können. Und was vor allem wichtig ist: Wie man eine Datei öffnet, soll sie auch - wenn man nichts verändert - wieder abgespeichert werden.

Wie kann ich in Qt eine Datei, die beliebig kodiert ist (wichtig wären ASCII, UTF-8 ) in einen QString einlesen, wieder in eine Datei abspeichern und richtig in einem Q(Plain)TextEdit darstellen?

QTextStream::setCodec() ist mir schon aufgefallen, die Zeichen werden aber trotzdem, nach langem rumprobieren, nicht richtig angezeigt.

Ich hoffe, man versteht mich. ;)

Vielen Dank im Voraus,
Amgon
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Zuerst den korrekten Codec heausfinden (wie auch immer) und dann per QTextStream & QTExtCodec die Daten einlesen.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Amgon
Beiträge: 7
Registriert: 26. September 2009 20:00

Beitrag von Amgon »

UTF-8 erkenne ich jetzt so:

Code: Alles auswählen

QTextCodec *TextEdit::getTextCodec(QString &text)
{

    // BOM
    if(text[0] == 0xEF ||
       text[1] == 0xBB ||
       text[2] == 0xBF)
        return QTextCodec::codecForName("UTF-8");

    // Byte über 128
    for(int i = 0; i < text.size(); ++i) {
        if(text.at(i).unicode() > 0x80)
            return QTextCodec::codecForName("UTF-8");
    }

    return QTextCodec::codecForLocale();
}
Das funktioniert auch, nur weiß ich nicht, wie ich damit dann weiter machen soll. Ich habe es jetzt so versucht:

Code: Alles auswählen

QString text = file.readAll();
QTextStream stream(&text);

stream.setCodec(getTextCodec(text));
QString eText = stream.readAll();
Aber eText enthält statt einem Sonderzeichen wie ™ nur â?¢.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

QFile::readAll() gibt ein QByteArray zurück, keinen QString!
Des weiteren kann man einen QTextStream auch gleich eine QIODevice übergeben.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Amgon
Beiträge: 7
Registriert: 26. September 2009 20:00

Beitrag von Amgon »

Und wie löst dann QIODevice mein Problem? Ich möchte einfach, dass dieses QByteArray dann als UTF-8 behandelt wird, komme aber selber nicht drauf - weder mit QTextStream, noch mit QIODevice.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Doku lesen hilft... QString::fromUtf8() sollte helfen.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten