Почему я не могу установить тип кодировки XDocument XDeclaration на iso-8859-1?

Почему следующий код не устанавливает тип кодировки объявления XML? Вместо этого он всегда устанавливает кодировку utf-16. Я упускаю что-то очень очевидное?

var xdoc = new XDocument(
  new XDeclaration("1.0", "iso-8859-1", null), 
  new XElement("root", "")
);

выход:

<?xml version="1.0" encoding="utf-16"?>
<root></root>

person David Glenn    schedule 09.10.2009    source источник
comment
Проверьте кодировку TextWriter, которую вы используете. См. здесь. . Если приведенная выше ссылка не работает, версия кэша Google все еще может быть доступна здесь.   -  person manji    schedule 09.10.2009


Ответы (3)


См. ответ об указании кодировки TextWriter.

В стороне: ISO-8859-1 - это набор символов, а не кодировка. Unicode также является набором символов, но UTF-16 представляет собой кодировку набора символов Unicode в последовательность байтов. Вы не можете указать кодировку документа как ISO-8859-1, так же как вы не можете указать набор символов документа как UTF-16. Обратите внимание, что Unicode — это собственный набор символов, а UTF-16 — это собственная кодировка Unicode для классов String .NET и Java и текстовых или строковых операций.

person yfeldblum    schedule 09.10.2009
comment
Означает ли это, что невозможно указать недопустимую кодировку с помощью XDocument? Я отправляю XML третьему лицу, которому требуется неверное объявление ‹?xml version=1.0 encoding=ISO-8859-1 ?›. - person David Glenn; 09.10.2009
comment
Я уверен, что вы можете. Какая система соответствует правильному использованию, языку и спецификации? - person yfeldblum; 09.10.2009

Как уже говорилось, реализация записи .NET XML/Stream «подхватывает» или интерпретирует кодировку откуда-то, кроме объявленной кодировки XML. Я успешно протестировал работающее решение, как описано в URL-адресе, содержащемся в более раннем сообщении о Stackoverflow.

XDocument xmlDoc = new XDocument(
        new XDeclaration("1.0", "utf-8", "no"), 
        new XElement("foo", "bar"));

MemoryStream memstream = new MemoryStream();
XmlTextWriter xmlwriter = new XmlTextWriter(memstream, new UTF8Encoding());

//'Write' (save) XDocument XML to MemoryStream-backed XmlTextWriter instance
xmlDoc.Save(xmlwriter);

//Read back XML string from stream
xmlwriter.Flush();    
memstream.Seek(0, SeekOrigin.Begin);  //OR "stream.Position = 0"
StreamReader streamreader = new StreamReader(memstream);
string xml = streamreader.ReadToEnd();

Console.WriteLine(xml);
Console.WriteLine(reader.ReadToEnd());

Я надеюсь, что это поможет кому-то.

Ваше здоровье

person Big Rich    schedule 04.10.2012

Я почему-то не могу найти здесь никакого рабочего ответа, поэтому вот реальное решение, которое выведет нужную кодировку в заголовке:

    private void CreateXml()
    {       
        XmlTextWriter xmlwriter = new XmlTextWriter("c:\\test.xml", Encoding.GetEncoding("iso-8859-1"));        

        XDocument xdoc = new XDocument(
          new XElement("Test")
        );

        xdoc.Save(xmlwriter);
        xmlwriter.Close();
    }

Причина, по которой вы получаете UTF-16, заключается в том, что строки кодируются с помощью UTF-16 в памяти, и пока вы не укажете кодировку для вывода XML, она переопределит кодировку в заголовке XML для соответствия фактическая используемая кодировка. Использование XmlTextWriter — это один из способов указания другой кодировки.

Вы также можете позволить XmlTextWriter записывать в MemoryStream, а затем преобразовать его обратно в string, если вам нужно выполнить всю операцию в памяти.

person floele    schedule 16.03.2014