Кодировка XmlWriter UTF-8 с использованием StringWriter в 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();
}

Должно быть что-то простое, чего мне не хватает?


person Web Tech    schedule 03.03.2017    source источник
comment
Можете ли вы поделиться своим кодом на .NETFiddle?   -  person aloisdg    schedule 03.03.2017
comment
Utf8StringWriter из этого ответа должно работать.   -  person dbc    schedule 03.03.2017
comment
Ваш код не компилируется - StringWriterWithEncoding не имеет конструктора без параметров. Или, может быть, ваша версия действительно имеет конструктор без параметров, который оставляет encoding со значением по умолчанию (null), что означает, что Encoding возвращает null? Это объяснило бы вашу проблему. В любом случае, если я сделаю StringWriterWithEncoding sw = new StringWriterWithEncoding(Encoding.UTF8);, все будет работать правильно. Пример скрипки.   -  person dbc    schedule 03.03.2017
comment
Спасатель жизни! Спасибо миллионному человеку!   -  person Web Tech    schedule 03.03.2017
comment
Пожалуйста, не входите в привычку добавлять как можно скорее попрошайничество к своим вопросам - добровольцы нашего сообщества ответят на досуге . Спасибо!   -  person halfer    schedule 04.03.2017


Ответы (2)


Ваш код не компилируется - 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 возвращает значение 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; }
    }
}
person dbc    schedule 03.03.2017

Просто используйте имя выходного файла для XmlWriter вместо StringWriterWithEncoding:

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

using (var writer = XmlWriter.Create(filePathName, settings))
{
    ...
person Interferank    schedule 03.03.2017
comment
Даже в этом случае заголовок XML по-прежнему <?xml version="1.0" encoding="utf-16"?> - person Steve Smith; 27.04.2018
comment
Это не работает. Кодировка заголовка XML по-прежнему utf-16 - person Jaken Herman; 25.04.2019
comment
Не работает, потому что кодировка перезаписана кодировкой, установленной на строковом устройстве. - person Chris Goodman; 27.09.2019