【问题标题】:XmlWriter encoding UTF-8 using StringWriter in C#XmlWriter 在 C# 中使用 StringWriter 编码 UTF-8
【发布时间】:2017-03-03 15:56:19
【问题描述】:

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

一定是我缺少的一些简单的东西吗?

【问题讨论】:

  • 你能在 .NETFiddle 上分享你的代码吗?
  • Utf8StringWriter from this answer 应该可以工作。
  • 您的代码无法编译 -- StringWriterWithEncoding 没有无参数构造函数。或者,也许您实际使用的版本确实有一个无参数构造函数,它将encoding 保留为其默认(null)值,这意味着Encoding 返回null?这可以解释你的问题。无论如何,如果我这样做 StringWriterWithEncoding sw = new StringWriterWithEncoding(Encoding.UTF8); 一切正常。示例fiddle.
  • 救命稻草!谢谢百万人!
  • 请不要养成在您的问题中添加“尽快”乞求的习惯——我们社区的志愿者will answer at leisure。谢谢!

标签: c# xml encoding utf-8 xmlwriter


【解决方案1】:

您的代码无法编译 -- 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 已保留其默认 (null) 值,这意味着 Encoding 返回 null,因此 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; }
    }
}

【讨论】:

    【解决方案2】:

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

    var settings = new XmlWriterSettings
    {
        Encoding = Encoding.UTF8,
        Indent = true
    };
    
    using (var writer = XmlWriter.Create(filePathName, settings))
    {
        ...
    

    【讨论】:

    • 即使这样,XML头还是&lt;?xml version="1.0" encoding="utf-16"?&gt;
    • 这不起作用。 XML头编码还是utf-16
    • 不起作用,因为编码被 stringwriter 上设置的编码覆盖。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-22
    • 2011-09-02
    • 2019-07-11
    • 1970-01-01
    • 2017-03-15
    • 1970-01-01
    相关资源
    最近更新 更多