使用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;");