代码之家  ›  专栏  ›  技术社区  ›  Christopher

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

  •  2
  • Christopher  · 技术社区  · 15 年前

    我的源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吗?那能解决吗?

    更新2:还有, &#x00A0; 正在将输出作为 ÿ

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

    4 回复  |  直到 15 年前
        1
  •  4
  •   Jon Skeet    15 年前

    &#x00A9; -它们是同一事物的不同表示形式,我希望内存中的表示形式可以规范化这一点。

    之后您将如何处理XML?任何处理结果XML的健全应用程序都应该可以使用它。

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

    StringWriter

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

    Encoding.ASCII

        2
  •  1
  •   Ben Valentine    15 年前

    我用这种方法保存一些立陶宛字符时也遇到了同样的问题。我找到了一个办法,通过替换 & 具有 &amp; ( &amp;#x00A9; &#x00A9; 等等)这看起来很奇怪,但对我很有效:)

        3
  •  0
  •   Ivo    15 年前

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

        4
  •  0
  •   kbrimington    15 年前

    看来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);
    

    ? 而不是。

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