Подтвердить что ты не робот

Почему Xdocument дает мне объявление utf16?

Я создаю XDocument следующим образом:

XDocument doc = new XDocument(
new XDeclaration("1.0", "utf-8", "yes"));

когда я сохраняю документ как это (doc.Save(@"c:\tijd\file2.xml");), я получаю следующее:

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

что нормально.

но я хочу вернуть содержимое как xml, и я нашел следующий код:

 var wr = new StringWriter(); 
            doc.Save(wr); 
            string s = (wr.GetStringBuilder().ToString());

этот код работает, но затем строка 's' начинается с этого:

<?xml version="1.0" encoding="utf-16" standalone="yes"?>

поэтому он изменился с utf8 на utf16, и это не то, что я хочу, потому что теперь я не могу прочитать его в Internet Explorer.

Есть ли способ предотвратить это поведение?

4b9b3361

Ответ 1

StringWriter рекламирует себя как использование UTF-16. Это легко исправить:

public class Utf8StringWriter : StringWriter
{
    public override Encoding Encoding { get { return Encoding.UTF8; } }
}

Этого должно быть достаточно в вашем конкретном случае. Более корректная реализация:

  • У конструкторов, соответствующих тем, которые находятся в StringWriter
  • Разрешить кодировку также указывать в конструкторе

Ответ 2

Очень хороший ответ, используя наследование, просто не забудьте переопределить инициализатор

   public class Utf8StringWriter : StringWriter
    {
        public Utf8StringWriter(StringBuilder sb) : base (sb)
        {
        }
        public override Encoding Encoding { get { return Encoding.UTF8; } }
    }

Ответ 3

Вам нужно будет установить StreamWriter.Encoding для использования UTF-8 вместо Unicode (UTF-16)

Увидев, что это не StreamWriter, этот ответ остается только для потомков.