.Net XmlWriter - 意外的编码让我感到困惑

8

环境是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无法处理它们而被省略):

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

为什么会生成错误的编码?我做错了什么?

2个回答

16

我怀疑这是因为它正在写入一个内在上是UTF-16的StringBuilder。解决方法是创建一个派生自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; }
    }
}

@Steven:哦,我不知道。这个问题已经发布了大约4分钟。按照SO的标准,这算是相当陈旧了... - Jon Skeet
啊哈 - 点击了链接 - 你是MVP。我早该知道了。我自己曾经作为WinSDK MVP花费了8年时间。随着我在这个托管的东西上苦苦挣扎,那些知识正在迅速变得陈旧。 - Bob Moore
还要注意,如果您在StringWriter专业化中让Encoding返回null,那么XmlWriter将仅写入XML声明为<?xml version="1.0"?>,即根本没有任何编码信息。这是一个完全有效的XML声明。如果我们对编码不确定,这是非常有用的。 - Jeppe Stig Nielsen

2

.Net字符串采用Unicode(UTF-16)编码。我认为这就是您在向StringBuilder写入时出现编码问题的根源。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接