qt + codierungen



  • QString ist übrigens ein Array aus QChar, welches jeweils 16 bit groß ist. Intern wird also UTF-16 benutzt. Wenn du wirklich die Daten als UTF8 speichern willst, so kannst du .toUtf8() nutzen. Empfehl ich dir aber nicht, benutz lieber die bereits serialisierten Streams von Qt.



  • Ich hatte dieses verdammt Problem schonmal und habs bisher noch nie kapiert, ich zeig euch mal den Code:

    #include <QtCore/QCoreApplication>
    #include <QDir>
    #include <QTextStream>
    
    int main()
    {
        QFile x("/home/anubis/test.txt");
        x.open( QIODevice::ReadWrite);
    
        QString s("Hällo");
    
        QTextStream out(&x);
        out.setCodec("UTF-8");
        out << s;
    
        return 0;
    }
    

    Wenn ich das so verwende wird der String anscheinend doppelt als UTF-8 interpretiert und ich bekomme ne seltsame Ausgabe.

    Ich frag einfach mal grad heraus: wie mache ich es richtig wenn ich als ergebnis unbedingt (systemunabhängig) utf-8 haben möchte?



  • Warum willst du denn unbedingt in UTF-8 schreiben? Du machst es dir dadurch nur schwerer den Text in Qt wieder einzulesen.

    Richtig wäre in diesem Fall QString::toUtf8(). Allerdings wird dann auch der Qt-Kram von QByteArray mitgeschriebne. Wenn du das auch nicht willst, dann musst du auf die Daten vom ByteArray direkt zugreifen und diese schreiben.



  • kannst du mal einen kompletten code posten wobei Hällo als utf-8 gespeichert wird?

    Egal was ich mache ich bekomme nur Schrott raus.
    Doppelt oder gar dreifach als UTF-8 interpretierter String... HILFE !

    (UTF-8 ist wichtig, da Teile der Datei XML sind, die wiederum von TinyXML ausgelesen werden sollen, welches darauf ausgerichtet ist UTF-8 einzulesen, also im Grunde wird die Datei ein Format zum Speichern)



  • Bin mir jetzt nicht sicher und habe hier kein Qt zum testen, aber es sollte so möglich sein:

    QString     string("Hallo");
    QTextStream stream(&file);
    
    stream << string.toUtf8().data();
    


  • Für sowas hat man doch immer seine Qt-Sourcen auf der Platte liegen.
    Look at
    <qt-src>/src/corelib/xml/qxmlstream.cpp
    Brav nach QXmlStreamWriter suchen (info: auch QXmlStreamWriterPrivate ist interessant ;))



  • das bringt mich noch um den verstand:

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

    Ausgabe:

    Hällo

    Also wieder doppelt utf-8 interpretiert.
    Wieso geht das nicht so einfach wie in java?
    Falsche Frage, wie gehts richtig?



  • shisha schrieb:

    Ausgabe:

    Hällo

    Also wieder doppelt utf-8 interpretiert.
    Wieso geht das nicht so einfach wie in java?
    Falsche Frage, wie gehts richtig?

    Du weißt, dass ein "ä" in UTF-8 zwei Bytes lang ist, oder? Also alles vollkommen richtig..



  • nicht richtig wenn man einen utf-8 editor verwendet 🙂

    Und um sicher zu gehen:

    C3 83 C2 A4
    

    Das ist nicht das erwartete C3 A4 für ein ä und immerhin 4 Byte.
    Diese Zeichenkette entsteht wie mir zwutz hier mal erklärt hat wenn man 2-mal UTF anwendet.

    Aber ich habe immer noch keine Lösung für dieses Problem (nächster Schritt wäre dann noch Verstehen )



  • kann mir jemand helfen?
    am besten mit mustercode



  • shisha schrieb:

    kann mir jemand helfen?
    am besten mit mustercode

    http://www.c-plusplus.net/forum/viewtopic-var-p-is-1874520.html#1874520



  • hmm?

    alles was ich da probiert habe funktioniert nicht so wie ich es will

    mit codec for locale klappts zwar aber ich weiß nicht wie es damit unter windosh aussehen würde


Anmelden zum Antworten