.Net XmlWriter - неожиданная кодировка сбивает меня с толку - PullRequest
8 голосов
/ 16 декабря 2008

Среда VS2008, .Net 3.5

Следующий код C # (обратите внимание на указанную кодировку UTF8)

XmlWriterSettings settings = new XmlWriterSettings ();
StringBuilder sb  = new StringBuilder();
settings.Encoding = System.Text.Encoding.UTF8;
settings.Indent   = false;
settings.NewLineChars = "\n";
settings.ConformanceLevel =  System.Xml.ConformanceLevel.Document;

XmlWriter writer = XmlWriter.Create (sb, settings);
{
   // Write XML data.
   writer.WriteStartElement ("CCHEADER");
   writer.WriteAttributeString ("ProtocolVersion", "1.0.0");
   writer.WriteAttributeString ("ServerCapabilities", "0x0000000F");
   writer.WriteEndElement ();
   writer.Flush ();
}

Фактически генерирует XML (> <опущено, потому что SO barfs на них): </p>

? Xml version = "1.0" encoding = "utf-16"?
CCHEADER ProtocolVersion = "1.0.0" ServerCapabilities = "0x0000000F" /

Почему я получаю неправильную кодировку, сгенерированную здесь? Что я делаю не так?

Ответы [ 2 ]

15 голосов
/ 16 декабря 2008

Я подозреваю, что это потому, что он пишет в StringBuilder, который по своей сути является UTF-16. Альтернативный способ обойти это - создать класс, производный от StringWriter, но переопределяющий свойство Encoding.

Полагаю, у меня есть один в MiscUtil - но все равно писать довольно тривиально Как то так:

public sealed class StringWriterWithEncoding : StringWriter
{
    private readonly Encoding encoding;

    public StringWriterWithEncoding (Encoding encoding)
    {
        this.encoding = encoding;
    }

    public override Encoding Encoding
    {
        get { return encoding; }
    }
}
2 голосов
/ 16 декабря 2008

. Net String кодируется в Unicode (UTF-16). Я ожидаю, что это источник ваших проблем с кодировкой, потому что вы пишете в StringBuilder.

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