Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何更改TextWriter对象中的编码?_C#_Xml_Encoding_Utf 8_Linq To Xml - Fatal编程技术网

C# 如何更改TextWriter对象中的编码?

C# 如何更改TextWriter对象中的编码?,c#,xml,encoding,utf-8,linq-to-xml,C#,Xml,Encoding,Utf 8,Linq To Xml,我在另一个resurse中使用API发送xml。我通过XDocument创建它: XDocument xDoc = new XDocument( new XDeclaration("1.0", "utf-8", "yes"), new XElement("Entity",new XAttribute("Type", "attribute1"), new XElement("Fields",... 当我把它放在请求中时,它没有声明就发送了。因此,我下一步要做: S

我在另一个resurse中使用API发送xml。我通过XDocument创建它:

XDocument xDoc = new XDocument(
    new XDeclaration("1.0", "utf-8", "yes"),
    new XElement("Entity",new XAttribute("Type", "attribute1"),
        new XElement("Fields",...
当我把它放在请求中时,它没有声明就发送了。因此,我下一步要做:

StringBuilder builder = new StringBuilder();
TextWriter writer = new StringWriter(builder);

using (writer)
{
    xDoc.Save(writer);
}
但是现在TextWriter将xml中的编码更改为utf-16。我需要在utf-8上再次更改它。

试试看

TextWriter ws = new StreamWriter(path, true, Encoding.UTF8);


这似乎有点奇怪,但如果要在xml中使用utf-8编码输出到
string
,则必须对
StringWriter
进行子类化

public class Program
{
    public static void Main(string[] args)
    {
        XDocument xDoc = new XDocument(
            new XDeclaration("1.0", "utf-8", "yes"),
            new XElement("Entity",new XAttribute("Type", "attribute1")));

        StringBuilder builder = new StringBuilder();
        using (TextWriter writer = new EncodingStringWriter(builder, Encoding.UTF8))
        {
            xDoc.Save(writer);
        }

        Console.WriteLine(builder.ToString());
    }
}

public class EncodingStringWriter : StringWriter
{
    private readonly Encoding _encoding;

    public EncodingStringWriter(StringBuilder builder, Encoding encoding) : base(builder)
    {
        _encoding = encoding;
    }

    public override Encoding Encoding
    {
        get { return _encoding;  }                
    }
}

或者
Encoding.GetEncoding(1256)
如果您需要特定的代码页(1256是阿拉伯语)
StreamWriter
似乎是显而易见的解决方案,是的;毕竟,它是
TextWriter
的特定编码自定义实现,是
XDocument.Save
所期望的类型。即使只是返回到字符串(但要正确使用XML声明),我也只是在
MemoryStream
上使用它。
public class Program
{
    public static void Main(string[] args)
    {
        XDocument xDoc = new XDocument(
            new XDeclaration("1.0", "utf-8", "yes"),
            new XElement("Entity",new XAttribute("Type", "attribute1")));

        StringBuilder builder = new StringBuilder();
        using (TextWriter writer = new EncodingStringWriter(builder, Encoding.UTF8))
        {
            xDoc.Save(writer);
        }

        Console.WriteLine(builder.ToString());
    }
}

public class EncodingStringWriter : StringWriter
{
    private readonly Encoding _encoding;

    public EncodingStringWriter(StringBuilder builder, Encoding encoding) : base(builder)
    {
        _encoding = encoding;
    }

    public override Encoding Encoding
    {
        get { return _encoding;  }                
    }
}