【问题标题】:Writing a Stream with FileStream without a BOM?在没有 BOM 的情况下使用 FileStream 编写流?
【发布时间】:2015-03-06 15:18:33
【问题描述】:

有没有办法在没有 BOM 的情况下使用 FileStream 编写 Stream? 我在这里做的是首先将 XmlNode 转换为 Stream 并稍后将流写入文件。我需要它采用 Stream 的形式才能与我的函数互操作。我可以用另一种方式来做,但如果可能的话,我想用这种方式来做。

Stream^ XmlToStream(XmlNode^ Node)
{
    Stream^ stream = gcnew MemoryStream();

    XmlDocument^ xmlDoc = gcnew XmlDocument();
    xmlDoc->PreserveWhitespace = true;
    xmlDoc->LoadXml(Node->OuterXml);
    xmlDoc->Save(stream);

//OR THIS:
//TODO: Handle exceptions
//  XmlWriterSettings^ settings = gcnew XmlWriterSettings();
//  settings->Encoding = System::Text::Encoding::UTF8;
//  settings->OmitXmlDeclaration = true;
//  settings->NewLineChars = "\n";
//  XmlWriter^ xwriter = XmlWriter::Create(stream, settings);
//  Node->WriteTo(xwriter);
//  xwriter->Close();

    return stream;
}

void StreamToFile(Stream^ DataStream, String^ FilePath)
{
    FileStream^ fileStream = gcnew FileStream(FilePath, FileMode::Create);
    if (DataStream->CanSeek)
    {
        DataStream->Seek(0, SeekOrigin::Begin);
    }
    DataStream->CopyTo(fileStream);
    fileStream->Close();
}

【问题讨论】:

    标签: c++-cli filestream byte-order-mark


    【解决方案1】:

    您正在获取 BOM,因为通过写入 MemoryStream 框架不知道正确的编码应该是什么。因此,它以 XmlDocument 的编码为基础,默认为 utf-8。这也会生成 BOM。

    要控制这一点,您需要将 TextWriter 对象传递给 XmlDocument::Save() 方法。这可以是一个 StreamWriter ,它反过来写入 MS。 StreamWriter 默认情况下也以 utf-8 编码,但除非您明确询问,否则不会生成 BOM,这正是您想要的。像这样:

    Stream^ XmlToStream(XmlNode^ Node)
    {
        auto stream = gcnew MemoryStream();
        auto writer = gcnew StreamWriter(stream);
        //...
        xmlDoc->Save(writer);
        writer->Flush();
        return stream;
    }
    

    【讨论】:

    • 感谢您的回答!但是您能解释一下为什么使用“auto”代替类型吗?我对 C++/CLI 很陌生。
    • 因为方便,一些 C++11 语法在 C++/CLI 中也能正常工作。
    猜你喜欢
    • 2013-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-27
    • 2021-09-13
    • 1970-01-01
    • 1970-01-01
    • 2020-01-27
    相关资源
    最近更新 更多