Просто несколько дополнительных объяснений, почему это так.
Строки - это последовательности символов, а не байты. Строки сами по себе не являются «кодированными», поскольку они используют символы, которые хранятся в виде кодовых точек Unicode. Кодирование НЕ ОСУЩЕСТВЛЯЕТ СМЫСЛ на строковом уровне.
Кодировка - это отображение последовательности кодовых точек (символов) в последовательность байтов (для хранения в системах, основанных на байтах, таких как файловые системы или память). Инфраструктура не позволяет указывать кодировки, если нет веских причин, например, чтобы 16-разрядные кодовые точки помещались в хранилище на основе байтов.
Таким образом, когда вы пытаетесь записать свой XML в StringBuilder, вы фактически строите последовательность символов XML и записываете их как последовательность символов, поэтому кодирование не выполняется. Следовательно, поле Кодировка отсутствует.
Если вы хотите использовать кодировку, XmlWriter должен выполнить запись в поток.
О решении, которое вы нашли с MemoryStream, без обид, но оно просто развевается вокруг рук и движется горячим воздухом. Вы кодируете свои кодовые точки с помощью «windows-1252», а затем снова анализируете их до кодовых точек. Единственное изменение, которое может произойти, - это то, что символы, не определенные в windows-1252, преобразуются в '?' персонаж в процессе.
Для меня правильным решением может быть следующее. В зависимости от того, для чего используется ваша функция, вы можете передать Stream в качестве параметра вашей функции, чтобы вызывающий абонент решал, следует ли записывать его в память или в файл. Так было бы написано так:
public static void WriteFieldsAsXmlDocument(ICollection fields, Stream outStream)
{
XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
settings.Encoding = Encoding.GetEncoding("windows-1250");
using(XmlWriter writer = XmlWriter.Create(outStream, settings)) {
writer.WriteStartDocument();
writer.WriteStartElement("data");
foreach (Field field in fields)
{
writer.WriteStartElement("item");
writer.WriteAttributeString("name", field.Id);
writer.WriteAttributeString("value", field.Value);
writer.WriteEndElement();
}
writer.WriteEndElement();
}
}