Раньше всегда использовал для создания заголовка стандартную конструкцию
C++ (Qt)
QDomNode xmlNode = m_doc.createProcessingInstruction("xml","version=\"1.0\" encoding=\"UTF-8\"");
m_doc.insertBefore(xmlNode, m_doc.firstChild());
при этом там где у меня XML сохрянялся в файл было так
C++ (Qt)
doc.save(out, 4 );
В документации сказано
If this node is a document node, the encoding of text stream str's encoding is set by treating a processing instruction by name "xml" as an XML declaration, if such a one exists, and otherwise defaults to UTF-8. XML declarations are not processing instructions, but this behavior exists for historical reasons. If this node is not a document node, the text stream's encoding is used.
При этом все как бы работало но заметил что при создании XML заголовок такой
<?xml version="1.0" encoding="UTF-8"?>
а если его потом открыть и сделать doc.setContent , поизменять ноды и сохранить (естественно m_doc.createProcessingInstruction заново не вызывается, т.к. нода содержащая эту инструкцию в читаемом документе уже есть), то заголовок становится таким
<?xml version='1.0' encoding='UTF-8'?>
Почему кавычки заменились на апострофы? Баг или фича - я пока не могу никак понять...
Кроме того почитав доку, нашел другой способ задания заголовка с которым он уже не меняет свой вид
1) m_doc.createProcessingInstruction для создания ноды с указанием кодировки не вызываем вообще!
2) при сохранении делаем так
C++ (Qt)
QTextStream out(&ofile);
out.setCodec( QTextCodec::codecForName("UTF-8") );
doc.save(out, 4, QDomNode::EncodingFromTextStream );
теперь заголовок всегда выгляит так
<?xml version="1.0" encoding="UTF-8"?>
Кроме того если использовать 2-й способ то даже если стереть заголовок из XML вручную - он будет дописан при первом пересохранении, а вот при первом (по крайней мере у меня createProcessingInstruction вызывался только при создании нового xml - чтобы не анализировать есть ли он там) не будет, соответственно второй способ всегда перекодирует файлы при записи, а первый только при создании xml.
Если кто сталкивался жду ответа...