Почему я не могу установить тип кодировки XDocument XDeclaration в iso-8859-1? - PullRequest
7 голосов
/ 09 октября 2009

Почему следующий код не устанавливает тип кодировки декларации 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>

Ответы [ 3 ]

5 голосов
/ 09 октября 2009

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

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

4 голосов
/ 04 октября 2012

Как уже говорилось, реализация .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());

Надеюсь, это кому-нибудь поможет.

Приветствия

1 голос
/ 16 марта 2014

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

    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, если вам нужно выполнить всю операцию в памяти.

...