XmlWriter 在 C# 中使用 StringWriter 编码 UTF-8

XmlWriter encoding UTF-8 using StringWriter in C#

我正在使用 C# 输出一个 xml 文件,我试图将 xml 编码值设置为 UTF-8,但它当前输出:

<?xml version="1.0"?>

这是我的代码:

public sealed class StringWriterWithEncoding: StringWriter {
    private readonly Encoding encoding;

    public StringWriterWithEncoding(Encoding encoding) {
        this.encoding = encoding;
    }

    public override Encoding Encoding {
        get {
            return encoding;
        }
    }
}

private string GetXml(JobStore jobStore) {
    StringWriterWithEncoding sw = new StringWriterWithEncoding();
    XmlWriterSettings settings = new XmlWriterSettings();
    settings.Encoding = Encoding.UTF8;
    settings.Encoding = Encoding.GetEncoding("utf-8");
    settings.Indent = true;
    using(var writer = XmlWriter.Create(sw, settings)) {
        writer.WriteStartDocument();
        writer.WriteStartElement("resources");

        writer.WriteStartElement("string");
        writer.WriteAttributeString("name");
        writer.WriteCData("value");
        writer.WriteEndElement();

        writer.WriteEndElement();
        writer.WriteEndDocument();
    }
    return sw.ToString();
}

一定是我遗漏了一些简单的东西吗?

只需使用 XmlWriter 的输出文件名而不是 StringWriterWithEncoding:

var settings = new XmlWriterSettings
{
    Encoding = Encoding.UTF8,
    Indent = true
};

using (var writer = XmlWriter.Create(filePathName, settings))
{
    ...

您的代码无法编译 -- StringWriterWithEncoding 没有无参数构造函数。或者,如果它确实有一个无参数的构造函数,也许它实际上看起来像这样?

public sealed class StringWriterWithEncoding : StringWriter
{
    private readonly Encoding encoding;

    public StringWriterWithEncoding() { }

    public StringWriterWithEncoding(Encoding encoding)
    {
        this.encoding = encoding;
    }

    public override Encoding Encoding
    {
        get { return encoding; }
    }
}

如果是这样,那就可以解释您的问题 - 字段 encoding 已保留其默认(空)值,这意味着 Encoding returns 为空,因此不会进行任何编码出现在 XML 文件中。

要修复它,删除无参数构造函数,然后执行:

var sw = new StringWriterWithEncoding(Encoding.UTF8);

或更改无参数构造函数以显式设置 Encoding.UTF8:

public sealed class StringWriterWithEncoding : StringWriter
{
    private readonly Encoding encoding;

    public StringWriterWithEncoding() : this(Encoding.UTF8) { }

    public StringWriterWithEncoding(Encoding encoding)
    {
        this.encoding = encoding;
    }

    public override Encoding Encoding
    {
        get { return encoding; }
    }
}