Seite 1 von 1

XML: Codierungsprobleme bei Umlauten

Verfasst: 2. August 2010 20:42
von GoaSkin
Hallo,

Es ist bekannt, dass gültige XML-Daten normalerweise UTF8-codiert gespeichert werden sollen. Erstelle ich ein Dom-Dokument 'doc', so wird es als UTF-8 gespeichert, wenn ich doc.toByteArray() in eine Datei speichere und mit dem aktuellen ISO-Zeichensatz (für XML eigentlich ungültig), wenn ich doc.toString() speichere - alles soweit korrekt.

Wenn es allerdings darum geht, die geschriebene XML-Datei wieder auszulesen, passiert Murks. Lese ich die Datei unter Windows ein, dann werden die in UTF-8 codierten Daten korrekt ausgelesen und in Strings umgesetzt, wie es auch sein sollte, während im Falle einer ISO-Codierung für die Sonderzeichen falsche Zeichen ausgelesen werden. Unter Linux hingegen habe ich bei ausgelesenen ISO-Daten korrekte Strings, während im Falle ausgelesener UTF-8 Daten in der Darstellung Codierungsfehler auftauchen (zwei Akzentzeichen für jedes Umlaut, kennt man).

Als Zwischenlösung wird doc.toString() unter Linux und doc.toByteArray() unter Windows in die Datei gespeichert, aber sauber ist diese Lösung ja nicht. Jemand eine Idee?

Verfasst: 2. August 2010 21:31
von Christian81
Wie liest Du denn die Datei ein? Wenn sie utf-8 codiert ist sollte man auch die korrekte QString - Funktion benutzen.

Verfasst: 2. August 2010 21:52
von franzf
Man braucht eigentlich gar kein QString und keine Gedanken wg. Encoding zu verschwernden.
QDomDocument::setContent() und QDomDocument::save() und gut ists. Letzteres kommt direkt von QDomNode, wovon QDomDocument abgeleitet ist.

Verfasst: 2. August 2010 22:11
von Christian81
Oder so :lol:

Verfasst: 2. August 2010 23:36
von GoaSkin
Speichern ist ja kein Problem. Da kann ich mir aussuchen, ob UTF-8 oder nicht und das funktioniert auch. Lediglich wenn ich UTF-8 einlese, klappt das (bei identischem Code) unter Windows wunderbar, aber nicht unter Linux.

Code: Alles auswählen

bool DSBrowser::load()
	{
	// clear all String lists
	while(!(allNames.isEmpty()))
		{
		allNames.removeLast();
		allDescriptions.removeLast();
		allImages.removeLast();
		allMovies.removeLast();
		allDirectories.removeLast();
		}

	// declare required variables
	QString errorStr, obname, content; 

	// inspect the document with XML parser functions
	QFile file("content/content.xml");
	QDomDocument doc;
	doc.setContent(&file);
	
	// find the root tag (in this case: <demoShow>)
	QDomElement root = doc.documentElement();
	
	// dive down into subtags
	QDomNode m = root.firstChild();
	while(!m.isNull())
		{
		QDomNode n = m.firstChild();
		while (!n.isNull())
			{
			QDomElement dsb = n.toElement();		
			if(dsb.tagName()=="name")
				allNames.append(dsb.text());
			if(dsb.tagName()=="description")
				allDescriptions.append(dsb.text());
			if(dsb.tagName()=="image")
				allImages.append(dsb.text());
			if(dsb.tagName()=="movie")
				allMovies.append(dsb.text());
			if(dsb.tagName()=="directory")
				allDirectories.append(dsb.text());
 			n = n.nextSibling(); 
			}
		m = m.nextSibling();
		}

	// file content is read now... we can close it
	file.close();

	// remove existing items
	movieBar->setCurrentRow(-1);
	movieBar->clear();

	// fill movie list
	movieBar->insertItems(0, allNames);
	for(int i=0;i<allImages.size();i++)
		movieBar->item(i)->setIcon(QIcon("content/" + allDirectories[i] + "/" + allImages[i]));


        // show default HTML page after update
        SWFView->setUrl(QUrl("default.html"));
	return true;
	}

Verfasst: 3. August 2010 10:24
von franzf
GoaSkin hat geschrieben:Speichern ist ja kein Problem. Da kann ich mir aussuchen, ob UTF-8 oder nicht und das funktioniert auch. Lediglich wenn ich UTF-8 einlese, klappt das (bei identischem Code) unter Windows wunderbar, aber nicht unter Linux.
Wie suchst du dir das denn genau aus? Es ist ja schön, wenn toByteArray() den Inhalt in UTF-8-kodiert zurückgibt, aber wenn du selber via QFile speicherst, interessiert das erstmal gar nicht, denn QFile verwendet ziemlich sicher ein anderes Encoding!
Verwende doch einfach zum Speichern die save()-Methode von QDomNode (also doc.save(textStream)), dann ist alles wunderbar, und beim nächsten Einlesen (durch ein simples "doc.setContent(&file)") gibt es keine Probleme.