QT- Utf-8 codierte Textdatei schreiben



  • Hallo ich möchte eigentlich nur eine Datei anlegen und dort Utf-8 codiert Hällo reinschreiben,
    folgnder Code liefert nicht das erwünschte Ergebnis:

    #include <QtCore/QCoreApplication>
    #include <QDir>
    
    int main()
    {
        QFile x("/home/kleopatra/test.txt");
        x.open( QIODevice::ReadWrite);
    
        QString s("Hällo");
        x.write(s.toUtf8());
        return 0;
    }
    

    wo liegt denn mein Fehler?



  • QTextStream out(&x);
    out.setCodec("UTF-8");
    out << s;
    


  • Kanst du das etwas ausführlicher erklären?

    1. warum läuft meins nicht
    2. was machst du genau
    3. gibt es alternativen?



  • Autsch, das funktioniert auch nicht so, ich erhalt stets:

    Hällo
    

    als Ausgabe statt Hällo



  • mit welcher Kodierung ist die Quelltextdatei abgespeichert?

    Versuch probehalber mal das:

    QTextStream out(&x);
    out.setCodec(QTextCodec::codecForLocale());
    out << s;
    


  • Also die Datei existiert vorher noch nicht, soll also neu angelegt werden.

    Ich arbeite unter Linux, wo UTF-8 doch eigentlich Standard sein sollte...

    also hier die Ausgabe deines Vorschlags:

    Hällo
    

    im hex-editor:

    48 C3 A4 6C 6C 6F
    

    was meiner Meinung nach Utf-8 ist.

    soweit recht gut, nun ein blick auf die Ausgabe von setCodec("UTF-8")

    48 C3 83 C2 A4 6C 6C 6F
    

    ich dachte ein ä wäre nur C3 A4 und nicht C3 83 C2 A4,
    das ist meiner Meinung nach KEIN utf-8 obwohl es doch explizit eingestellt wird.

    Und nun bin ich gespannt auf Erklärungen ^^, denn ich kann es mir nicht erklären 🙂



  • nun, du hast tatsächlich als UTF-8 abgespeichert, soweit passts.

    Du speicherst die Datei und aus 'ä' wird 'C3 A4'.

    Jetzt gibst du diesen UTF8-String aber dem ASCII-Konstruktor des QStrings. Mit setCodec("UTF-8") lässt du das aber wieder als UTF-8 interpretieren. Und so wird ASCII 'C3 A4' UTF-8-codiert zu 'C3 83 C2 A4'



  • Ausweg?

    irgendwie mit fromUtf8() ?



  • fromLatin1() sollte gehen.


Anmelden zum Antworten