如何在Qt中设置XML文件的编码?

4

我在Qt中编写了一个XML文件:

QString fname = "L.xml";
QFile file(fname);
if (file.open(QIODevice::WriteOnly)) {

    QTextStream streamFileOut(&file);
    streamFileOut.setCodec("Windows-1251");

    QString string;

    QXmlStreamWriter xmlWriter(&string);
    xmlWriter.setAutoFormatting(true);
    xmlWriter.writeStartDocument();
        xmlWriter.writeStartElement("LIST");

            xmlWriter.writeStartElement("V");
            xmlWriter.writeCharacters("Привет");
            xmlWriter.writeEndElement();

            xmlWriter.writeStartElement("S");
            xmlWriter.writeCharacters("Привет");
            xmlWriter.writeEndElement();


        xmlWriter.writeEndElement();
    xmlWriter.writeEndDocument();

    streamFileOut << string;
    streamFileOut.flush();
    file.close();
}

I get the following XML:

<?xml version="1.0"?>
<LIST>
    <V>Привет</V>
    <S>Привет</S>
</LIST>

我需要获取XML:

<?xml version="1.0" encoding="windows-1251" ?>
<LIST>
    <V>Привет</V>
    <S>Привет</S>
</LIST>

在我的XML中没有。如何修复?

你真的需要指定编码吗?我认为解析器应该自动“猜测”编码。 - vahancho
3
您可以在 https://doc.qt.io/qt-5/qxmlstreamwriter.html 找到 QXmlStreamWriter 类的文档,其中包含您的问题的答案。恰巧我自己不知道这个问题的答案,但我只是在我的浏览器的 Google 搜索框中键入了 "QXmlStreamWriter",几秒钟后就得到了答案。了解如何查找和阅读技术文档是每个 C++ 开发人员所必需的技能。 - Sam Varshavchik
void QXmlStreamWriter::writeStartDocument()?在其中需要写什么? - Артём Хутченко
1个回答

4

使用QXmlStreamWriter::setCodec(),但是如果你将流直接输出到QString中并且还想保留编码属性的话,就无法保证了,正如文档所述。直接将流输出到文件中即可:

#include <QFile>
#include <QXmlStreamWriter>
#include <QString>

int main()
{
    auto file = QFile{ "L.xml" };
    if (file.open(QIODevice::WriteOnly))
    {
        auto xmlWriter = QXmlStreamWriter{ &file };
        xmlWriter.setAutoFormatting(true);
        xmlWriter.setCodec("windows-1251");
        xmlWriter.writeStartDocument();
        {
            xmlWriter.writeStartElement("LIST");
            {
                xmlWriter.writeStartElement("V");
                {
                    xmlWriter.writeCharacters(u8"Привет");
                }
                xmlWriter.writeEndElement();

                xmlWriter.writeStartElement("S");
                {
                    xmlWriter.writeCharacters(u8"Привет");
                }
                xmlWriter.writeEndElement();
            }
            xmlWriter.writeEndElement();
        }
        xmlWriter.writeEndDocument();
    }
}

产生:

<?xml version="1.0" encoding="windows-1251"?>
<LIST>
    <V>Привет</V>
    <S>Привет</S>
</LIST>

xmlWriter.setCodec("Windows-1251"); 我得到了 <?xml version="1.0"?>。 - Артём Хутченко

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接