почему Xdocument дает мне объявление utf16? - PullRequest
29 голосов
/ 09 марта 2011

Я создаю 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.

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

Ответы [ 3 ]

38 голосов
/ 09 марта 2011

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

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

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

  • Наличие конструкторов, совпадающих с конструкторами в StringWriter
  • Разрешить указание кодировки и в конструкторе
2 голосов
/ 30 января 2013

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

   public class Utf8StringWriter : StringWriter
    {
        public Utf8StringWriter(StringBuilder sb) : base (sb)
        {
        }
        public override Encoding Encoding { get { return Encoding.UTF8; } }
    }
1 голос
/ 09 марта 2011

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

Поскольку этот ответ не StreamWriter, этот ответ оставлен только для потомков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...