繁体   English   中英

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

[英]How do I preserve special characters when writing XML with XDocument.Save()?

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

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

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

更新:我还注意到源声明看起来像<?xml version="1.0" encoding="utf-8"?>但是我保存的输出看起来像是<?xml version="1.0" encoding="utf-16"?> 我可以指出我希望输出仍然是utf-8吗? 这样可以解决吗?

Update2:此外, &#x00A0; 正在输出为ÿ 我绝对不希望这样!

更新3: &#x00A7; 正在变成一个小盒子,那也是错误的。 应该是§

我强烈怀疑您将无法执行此操作。 从根本上讲,版权标志 &#x00A9; -它们是同一件事的不同表示形式,我希望内存中的表示形式可以对此进行规范化。

之后,您将如何处理XML? 任何理智的应用程序处理生成的XML都可以。

如果您使用ASCII明确编码它,您也许可以说服它使用实体引用。但是我不确定。

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

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

您可以尝试将其更改为也使用Encoding.ASCII ,然后看看对版权符号有什么作用...

以这种方式保存一些立陶宛语字符时,我遇到了同样的问题。 我找到了一种方法,可以通过用&amp;替换&来作弊 &amp;#x00A9;编写&#x00A9;依此类推)看起来很奇怪,但对我&#x00A9; :)

也许您可以尝试不同的文档编码,请查看: 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;");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM