qt + codierungen
-
Also ich habe ein Problem damit Codierungen und deren Verwendungen zu verstehen.
Ziel ist es einfach Utf-8 codiert in eine Textdatei zu schreiben.
Dieser Code funktioniert, aber ich will verstehen was ich da stehen habe:
#include <QtCore/QCoreApplication> #include <QDir> int main() { QFile x("test.txt"); x.open( QIODevice::ReadWrite); QString s("Hällo"); x.write(s.toLocal8Bit()); return 0; }
Hat ein QString nach seiner Erstellung schon eine Codierung, und wenn ja welche ist das?
was bewirkt s.toLocal8Bit genau?
Ich arbeite unter Linux wo UTF-8 standard ist.Würde dieser Code auch auf einem anderen System funktionieren?
-
toLocal8Bit liefert ein Byte-Array zurück, welches den String in der lokalen 8bit Repräsentation von zeichenketten zurück. Ist dies auf einem System ASCII, so ist der Funktionsauruf identisch mit toAscii(). Ist dies auf dem System, wie auf den meisten Deutschen, Latin1, so ist der Funktionsaufruf identisch mit toLatin1().
Besser wäre, wenn du dir zusätzlich einen Data- oder TextStream erstellst, und mittels diesen deine Daten in die Datei schreibst.
QString str("Hello"); QFile x("test.txt"); x.open( QIODevice::ReadWrite); QDataStream stream(&file); stream << str;
Diese Daten sind dann auch automatisch serialisiert, dank Qt.
-
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 mustercodehttp://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