为什么Xdocument给我一个utf16声明?

时间:2011-03-09 15:56:29

标签: c# linq-to-xml

我正在创建一个这样的XDocument:

XDocument doc = new XDocument(
new XDeclaration("1.0", "utf-8", "yes"));

当我像这样保存文档(doc.Save(@"c:\tijd\file2.xml");)时,我得到了这个:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>

没关系。

但我想将内容作为xml返回,我找到了以下代码:

 var wr = new StringWriter(); 
            doc.Save(wr); 
            string s = (wr.GetStringBuilder().ToString());

此代码有效,但字符串's'以此开头:

<?xml version="1.0" encoding="utf-16" standalone="yes"?>

所以它从utf8变为utf16,这不是我想要的,因为现在我无法在Internet Explorer中阅读它。

有没有办法防止这种行为?

3 个答案:

答案 0 :(得分:37)

StringWriter将自己宣传为使用UTF-16。虽然很容易解决:

public class Utf8StringWriter : StringWriter
{
    public override Encoding Encoding { get { return Encoding.UTF8; } }
}

在您的特定情况下,这应该足够了。一个相当全面的实现将:

  • 让构造函数与StringWriter
  • 中的构造函数匹配
  • 允许在构造函数中指定编码

答案 1 :(得分:2)

使用继承非常好的答案,只需记住覆盖初始化程序

   public class Utf8StringWriter : StringWriter
    {
        public Utf8StringWriter(StringBuilder sb) : base (sb)
        {
        }
        public override Encoding Encoding { get { return Encoding.UTF8; } }
    }

答案 2 :(得分:1)

您需要将StreamWriter.Encoding设置为使用UTF-8而不是Unicode(UTF-16)

看到它不是StreamWriter,这个答案仅留给子孙后代。