首页 > 解决方案 > 如何在 Qt 中设置 XML 文件的编码?

问题描述

我在 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();
}

我得到以下 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 中没有encoding = "windows-1251"。如何解决这个问题?

标签: c++xmlqt

解决方案


使用QXmlStreamWriter::setCodec(),但您不能流式传输到 aQString并且仍然保留 encoding 属性,如文档所述。直接进入一个文件,它的工作原理:

#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>

推荐阅读