WriteStartDocument写入的错误XML编码标记

4
我将XMLWriter设置为使用UTF8编码,但WriteStartDocument方法仍然写入UTF16标记。
以下是代码的部分内容:
            m_sbXML = New System.Text.StringBuilder

            m_xmlWriterSettings = New System.Xml.XmlWriterSettings
            With m_xmlWriterSettings
                .Indent = True
                .IndentChars = "    "
                .Encoding = System.Text.Encoding.UTF8
            End With

            m_xmlWriter = System.Xml.XmlWriter.Create(m_sbXML, m_xmlWriterSettings)

            Call m_xmlWriter.WriteStartDocument()

应该编写文档标签:

<?xml version="1.0" encoding="utf-8"?>

但实际上它写下了:
<?xml version="1.0" encoding="utf-16"?>
1个回答

3

您正在使用 StringBuilder 进行编写。在 .NET 中,字符串始终采用 UTF-16 编码。

如果您想创建一个 UTF-8 编码的 XML 文件,请写入一个 Stream

示例:

var settings = new XmlWriterSettings
{
    Indent = True,
    IndentChars = "    ",
    Encoding = Encoding.UTF8
};

using (var stream = new MemoryStream())
using (var writer = XmlWriter.Create(stream, settings))
{
    writer.WriteStartDocument();
    // ...
}

谢谢您使用内存流的建议,但我更喜欢使用StringBuilder。如果需要,我会使用UTF16来解决问题,但尽管文档标记似乎没问题,在IE中打开XML会导致错误,提示“不支持从当前编码切换到指定编码...”。 - user564548
错误很可能是因为您将结果字符串保存为UTF-8。您可以选择使用StringBuilder,然后将字符串保存为UTF-16,或者使用Stream并指定任何编码方式。 - Alexei Levenkov
我已经使用UTF16进行测试,但这并不能解决上述所述的IE错误。 - user564548
1
目前我已经通过使用此页面中描述的其中一种解决方法来解决了这个问题:http://www.undermyhat.org/blog/2009/08/tip-force-utf8-or-other-encoding-for-xmlwriter-with-stringbuilder/ - user564548

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