使用XDocument.Save()编写XML时如何保留特殊字符?

我的源XML在其中具有版权特征© 。 使用以下代码编写XML时:

 var stringWriter = new StringWriter(); segmentDoc.Save(stringWriter); Console.WriteLine(stringWriter.ToString()); 

它将版权字符渲染为带有圆圈的小“c”。 我想保留原始代码,以便将其吐出来© 。 我怎样才能做到这一点?

更新:我还注意到源声明看起来像但我保存的输出看起来像 。 我可以指出我希望输出仍然是utf-8吗? 那能解决吗?

Update2:此外,   输出为ÿ 。 我绝对不希望发生这种情况!

Update3: § 正在成为一个小盒子,这也是错误的。 它应该是§

我强烈怀疑你无法做到这一点。 从根本上说,版权符号 © – 它们是同一事物的不同表示forms,我希望内存中的表示forms对此进行规范化。

之后你在用XML做什么? 处理生成的XML的任何理智的应用程序应该没问题。

如果你用ASCII显式编码它,你可以说服它使用实体引用…但我不确定。

编辑:你绝对可以使它使用不同的编码。 您只需要一个StringWriter ,它报告其“本机”编码是UTF-8。 这是一个可用于此的简单类:

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

您可以尝试更改它以使用Encoding.ASCII ,并查看它对版权符号的作用…

以这种方式保存一些立陶宛字符时遇到了同样的问题。 我找到了一种方法来欺骗这个,取而代之的是&©©依此类推)它看起来很奇怪,但它对我© 🙂

也许您可以尝试不同的文档编码,请查看: http : //www.sagehill.net/docbookxsl/CharEncoding.html

似乎UTF8无法解决问题。 以下与您的代码具有相同的症状:

 MemoryStream ms = new MemoryStream(); XmlTextWriter writer = new XmlTextWriter(ms, new UTF8Encoding()); segmentDoc.Save(writer); ms.Seek(0L, SeekOrigin.Begin); var reader = new StreamReader(ms); var result = reader.ReadToEnd(); Console.WriteLine(result); 

我用ASCII尝试了相同的方法,但结束了? 而不是©。

我认为在将XML转换为字符串后使用字符串替换是获得所需效果的最佳选择。 当然,如果你不仅仅对@copy感兴趣,这可能很麻烦; 符号。

 result = result.Replace("©", "\u0026#x00A9;");