Seite 1 von 1

Unicode von Datei laden und abspeichern

Verfasst: 16. Dezember 2009 21:17
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

Verfasst: 17. Dezember 2009 10:20
von Christian81
Zuerst den korrekten Codec heausfinden (wie auch immer) und dann per QTextStream & QTExtCodec die Daten einlesen.

Verfasst: 17. Dezember 2009 13:11
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 â?¢.

Verfasst: 17. Dezember 2009 17:25
von Christian81
QFile::readAll() gibt ein QByteArray zurück, keinen QString!
Des weiteren kann man einen QTextStream auch gleich eine QIODevice übergeben.

Verfasst: 17. Dezember 2009 21:42
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.

Verfasst: 18. Dezember 2009 11:30
von Christian81
Doku lesen hilft... QString::fromUtf8() sollte helfen.