C# 如何将XmlDocument.Save()保存为encoding=";美国ascii“;使用数字字符实体而不是问号?

C# 如何将XmlDocument.Save()保存为encoding=";美国ascii“;使用数字字符实体而不是问号?,c#,.net,xml,xmldocument,xml-encoding,C#,.net,Xml,Xmldocument,Xml Encoding,我的目标是在不丢失Unicode字符的情况下获得XML的二进制缓冲区(MemoryStream.ToArray()在本例中将产生byte[])。我希望XML序列化程序使用数字字符引用来表示任何在ASCII中无效的内容。到目前为止,我已经: using System; using System.IO; using System.Text; using System.Xml; class Program { static void Main(string[] args) {

我的目标是在不丢失Unicode字符的情况下获得XML的二进制缓冲区(
MemoryStream.ToArray()
在本例中将产生
byte[]
)。我希望XML序列化程序使用数字字符引用来表示任何在ASCII中无效的内容。到目前为止,我已经:

using System;
using System.IO;
using System.Text;
using System.Xml;

class Program
{
    static void Main(string[] args)
    {
        var doc = new XmlDocument();
        doc.LoadXml("<x>“∞π”</x>");
        using (var buf = new MemoryStream())
        {
            using (var writer = new StreamWriter(buf, Encoding.ASCII))
                doc.Save(writer);
            Console.Write(Encoding.ASCII.GetString(buf.ToArray()));
        }
    }
}
使用系统;
使用System.IO;
使用系统文本;
使用System.Xml;
班级计划
{
静态void Main(字符串[]参数)
{
var doc=新的XmlDocument();
doc.LoadXml(“”)∞π”");
使用(var buf=new MemoryStream())
{
使用(var writer=newstreamwriter(buf,Encoding.ASCII))
保存文档(编写器);
Write(Encoding.ASCII.GetString(buf.ToArray());
}
}
}
上述程序产生以下输出:

$ ./ConsoleApplication2.exe
<?xml version="1.0" encoding="us-ascii"?>
<x>????</x>
$。/ConsoleApplication2.exe
????
我找到了如何告诉
XmlDocument.Save()
使用
encoding=“us ascii”
——方法是将
TextStream.encoding设置为
encoding.ascii
。表示
TextWriter上的编码决定写入的编码。但是我如何告诉它我希望它使用数字字符实体而不是默认的有损行为呢?我已经测试了
doc.Save(Console.OpenStandardOutput())
使用所有正确的字符将预期的数据(没有XML声明)写入UTF-8,因此我知道
doc
包含我希望序列化的信息。只需找出正确的方法,告诉XML序列化程序我想要
encoding=“us ascii”
字符实体

我知道,编写既支持
编码=“us ascii”
又支持
之类的结构的XML文档可能不是一件小事(我认为这可能只适用于外部文档类型定义。是的)。但我认为在ASCII XML文档中为非ASCII字符输出实体以支持在Unicode不友好的环境中保存内容属性值字符数据是很常见的。我认为表示Unicode字符的数字字符引用类似于使用base64来保护blob,同时保持内容的可读性。如何使用.NET执行此操作?

您可以改为使用:

var doc=new XmlDocument();
doc.LoadXml(“”)∞π”");
使用(var buf=new MemoryStream())
{
使用(var writer=XmlWriter.Create)(buf,
新的XmlWriterSettings{Encoding=Encoding.ASCII})
{
保存文档(编写器);
}
Write(Encoding.ASCII.GetString(buf.ToArray());
}
产出:

<?xml version="1.0" encoding="us-ascii"?><x>&#x201C;&#x221E;&#x3C0;&#x201D;</x> 
“∞π”;

如果您只是通过Console进行检查,您可能需要检查Console.OutputeneCoding。@Twellt但我的目标是将XML序列化为ASCII格式(这意味着它可以在英语系统上设置为Console.OutputeneCoding的任何编码模式下继续存在)。您能帮助我如何转换ä;至ä;通过使用xmldocumentlibrary@Karthick这是一个奇怪的愿望。。。在任何情况下,您都应该单独问一个问题,并解释为什么它对您的文本很重要(从XML的角度来看绝对没有区别)。是的,两者都是相同的,但我需要保留源XML中的内容。请参见此处
<?xml version="1.0" encoding="us-ascii"?><x>&#x201C;&#x221E;&#x3C0;&#x201D;</x>