如何使用数字字符实体而不是问号XmlDocument.Save()到encoding =“us-ascii”?

我的目标是在不丢失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("“∞π”"); using (var buf = new MemoryStream()) { using (var writer = new StreamWriter(buf, Encoding.ASCII)) doc.Save(writer); Console.Write(Encoding.ASCII.GetString(buf.ToArray())); } } } 

上面的程序产生以下输出:

 $ ./ConsoleApplication2.exe  ???? 

我想通了如何告诉XmlDocument.Save()使用encoding="us-ascii" -by将TextStream.Encoding设置为Encoding.ASCII TextStream.Encoding 。 文档说明The encoding on the TextWriter determines the encoding that is written out 。 但是,我怎么能告诉它我希望它使用数字字符实体而不是其默认的有损行为? 我已经测试过doc.Save(Console.OpenStandardOutput())将所需的数据(没有XML声明)写成带有所有正确字符的UTF-8,所以我知道doc包含了我希望序列化的信息。 这只是找出告诉XML序列化器我想要使用字符实体encoding="us-ascii"的正确方法的问题…

我理解编写兼容encoding="us-ascii" XML文档并支持像这样的结构可能并非易事(我认为这可能只适用于外部文档类型定义。是的, 我我只是为了好玩而尝试过 。) 但我认为在ASCII XML文档中输出非ASCII字符的实体以支持在不友好的Unicode环境中保存内容属性值字符数据是很常见的。 我认为表示Unicode字符的数字字符引用类似于使用base64保护blob同时保持内容更具可读性。 我如何用.NET做到这一点?

您可以改用XmlWriter :

  var doc = new XmlDocument(); doc.LoadXml("“∞π”"); using (var buf = new MemoryStream()) { using (var writer = XmlWriter.Create(buf, new XmlWriterSettings{Encoding= Encoding.ASCII})) { doc.Save(writer); } Console.Write(Encoding.ASCII.GetString(buf.ToArray())); } 

输出:

 “∞π”