C# 如何更改TextWriter对象中的编码?
我在另一个resurse中使用API发送xml。我通过XDocument创建它: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
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; }
}
}