XML: Codierungsprobleme bei Umlauten

Alles rund um die Programmierung mit Qt
Antworten
GoaSkin
Beiträge: 103
Registriert: 13. Juni 2007 00:14
Wohnort: Darmstadt

XML: Codierungsprobleme bei Umlauten

Beitrag 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?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Wie liest Du denn die Datei ein? Wenn sie utf-8 codiert ist sollte man auch die korrekte QString - Funktion benutzen.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Oder so :lol:
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
GoaSkin
Beiträge: 103
Registriert: 13. Juni 2007 00:14
Wohnort: Darmstadt

Beitrag 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;
	}
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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.
Antworten