Probleme mit der Kodierung

Alles rund um die Programmierung mit Qt
Antworten
kleineSchildy
Beiträge: 76
Registriert: 16. September 2004 18:29
Wohnort: Dresden

Probleme mit der Kodierung

Beitrag von kleineSchildy »

Hallo,

nach reichlicher Sucherei und Probiererei, habe ich es nun geschafft, mein XML-File in die Datenbank zu schreiben.

Nun ist gleich das nächste Problem aufgetreten. Das XML-File, was in der Datenbank steht scheint falsch kodiert zu sein. Zwischen jeden Zeichen ist ein Leerzeichen. Das sieht dann etwa so aus:

< ? x m l v e r s i o n = " 1 . 0 " e n c o d i n g = " U T F - 1 6 " s t

Das ist natürlich schlecht, weil mein Programm mit diesem XML nichts anfangen kann.

Wie bekomm ich diese Leerzeichen weg?

Es passiert dierekt beim Reinschreiben, denn wenn ich mein QCString in ein File schreibe, wird es richtig angezeigt.

Ich vermute, daß mein QCString in "utf8" ist, aber meine Datenbank mit "utf16" arbeitet. Leider kann ich an der Datenbank nichts ändern.

Kann mir jemand helfen?

Viele Grüße
Jana

Mein Code:

Code: Alles auswählen

void Database::enterIntoTricsyDB(QString loc){

	//to define the path
	QString pfad = "";
	pfad.append("./");
	pfad.append(loc);

	QFile file_neu( "layout.txt" );
	file_neu.open(IO_ReadOnly);

	QString data;

	QTextCodec *tcodec = QTextCodec::codecForName("utf8");
	data = QString::fromUtf8( file_neu.readAll(), -1);
    QCString Data = tcodec->fromUnicode(data);

	QSqlQuery insert(database);
	insert.prepare("INSERT INTO maps (path, name, content)"
				   "VALUES (:path, :name, :content)");
	insert.bindValue(":path",QString(pfad));
	insert.bindValue(":name",QString(name));
	insert.bindValue(":content", Data);
	insert.exec();
	
	file_neu.close();
}
Spring-Daniel
Beiträge: 40
Registriert: 4. Oktober 2004 16:26

Beitrag von Spring-Daniel »

Hej,

1. schonmal probiert, direkt data zu verwenden, ohne die Umwandlung mit tcodec?

2. welche Datenbank benutzt Du? Mein Brot hier momenten sind die Datenbanktreiber... also hab ich einigermassen Ueberblick, und koennt mal nachschauen was so passiert.
kleineSchildy
Beiträge: 76
Registriert: 16. September 2004 18:29
Wohnort: Dresden

Beitrag von kleineSchildy »

Hi Daniel,

1. ja, habe ich. Das ist genau der gleiche Effekt. Deswegen habe ich es ja mit dem Kodieren versucht.

2. Ich benutze Oracle 9.2.0.5.0 und als QT-Treiber "QOCI8". Evt. macht das Probleme?

Meine Idee war, mein QString irgendwie zu konvertieren, damit diese Leerzeichen verschwinden, weil an der Datenbank kann ich leider nix ändern.

Die Datenbank arbeitet mit "urf16" und ich schreibe ein File rein, was "utf8" ist. Wie kann man das File in "utf16" konvertieren?

Viele Grüße
Jana
Spring-Daniel
Beiträge: 40
Registriert: 4. Oktober 2004 16:26

Beitrag von Spring-Daniel »

Oracle.. meine LIEBLINGS-Datenbank. Naja.

Naechster Vorschlag: readAll() liefert ein ByteArray. Schonmal versucht, dieses direkt zu verwenden?
(Allerdings sind wir dann ja wieder in dem Szenario von deinem letzten Thread, und ob das dann wieder funktioniert? )

Viel Erfolg noch.
kleineSchildy
Beiträge: 76
Registriert: 16. September 2004 18:29
Wohnort: Dresden

Beitrag von kleineSchildy »

Hi Daniel,

Mit QByteArray brauche ich es garnicht versuchen, das funktioniert noch weniger :roll:

Ich habe nun einen neuen interessanten Effekt.

Ich erzeuge in meinen Programm ja zwei XML-Files, wobei das eine etwas kleiner ausfällt, weil es quasi eine abgespeckte Version vom ersten ist.

Mit diesem Code funktioniert das Reinschreiben in die Datenbank für das kleinere XML-File:

Code: Alles auswählen

	QString path = "";
	path.append("./");
	path.append(project_name);
	path.append("/layout");

	QString name ="";
	name.append(project_name);
	name.append("v1");

	QFile file_neu( "layout.txt" );
	file_neu.open(IO_ReadOnly);

	QString data;

	QTextCodec *tcodec = QTextCodec::codecForName("utf8");
	data = QString::fromUtf8( file_neu.readAll(), -1);
    QCString Data = tcodec->fromUnicode(data);

	QSqlQuery insert(database);
	insert.prepare("INSERT INTO maps (path, name, content)"
				   "VALUES (:path, :name, :content)");
	insert.bindValue(":path",QString(path));
	insert.bindValue(":name",QString(name));
	insert.bindValue(":content", Data);
	insert.exec();

	file_neu.close();
Ich habe diese Methode wirklich 1 zu 1 in meine andere Methode kopiert, wo das größere XML-File in die Datenbank geschrieben wird.
Es funktioniert dort immernoch nicht :evil:

Kann das einer verstehen???

Viele Grüße
Jana[/code]
kleineSchildy
Beiträge: 76
Registriert: 16. September 2004 18:29
Wohnort: Dresden

Beitrag von kleineSchildy »

Hallo,

also ich habe jetzt aus einem anderen Forum erfahren, daß ich oracle.sql.BLOB oder oracle.sql.CLOB verwenden soll. Diese Klassen sind allerdings nicht in Qt enthalten.

Es wird reines C++ sein. Hat damit schonmal jemand gearbeitet? Werden Methoden, die kein Qt-Code enthalten, genauso behandelt, wie alle anderen?

Grüße
Jana
arno
Beiträge: 7
Registriert: 16. Januar 2005 15:48
Wohnort: Stadtprozelten
Kontaktdaten:

Beitrag von arno »

Gibt es da inzwischen eine Lösung?
Ich habe ähnliche Schwierigkeiten bei einem anderen Problem. Meine Windoof-User schreiben mir per PHP und Browser in eine MySQL Datenbank Windoof-spezifische Sonderzeichen im Bereich zwischen x80 und x9f.

Nun versuche ich eine Datenbank mit Postgres aufzubauen, um die Daten zu säubern und zu konsolidieren.

Bei dieser Gelegenheit ersetze ich die Zeichen zwischen x80 und x9f durch passende html entities (z. B. &trade; statt TM - Zeichen).

Dabei passiert mir das gleiche. Hier ein Codeschnipsel:

Code: Alles auswählen

QString sVal(qry.value(4).toString());
sVal.replace( QRegExp("\\x86"), "&dagger;" );
sVal.replace( QRegExp("\\x87"), "&Dagger;" );
sVal.replace( QRegExp("\\x88"), "&circ;" );
sVal.replace( QRegExp("\\x95"), "&bull;" );
sVal.replace( QRegExp("\\x89"), "&permil;" );
teDescription->setText(sVal);
archer
Beiträge: 306
Registriert: 2. Februar 2006 09:56

Beitrag von archer »

Bin in die Falsche diskussion gerutscht, sorry...
Antworten