我的源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:此外, 
的输出为ÿ
。我绝对不希望发生这种情况!
Update3:§
正在成为一个小盒子,这也是错误的。它应该是§
答案 0 :(得分:3)
我强烈怀疑你无法做到这一点。从根本上说,版权符号是 ©
- 它们是同一事物的不同表示,我希望内存中的表示可以规范化。
之后您在使用XML做什么?处理生成的XML的任何理智的应用程序应该没问题。
如果您使用ASCII显式编码,可能 能够说服它使用实体引用...但我不确定。
编辑:你绝对可以使用不同的编码。您只需要StringWriter
报告其“本机”编码为UTF-8。这是一个可以用于此的简单类:
public class Utf8StringWriter : StringWriter
{
public override Encoding Encoding
{
get { return Encoding.UTF8; }
}
}
您可以尝试将其更改为使用Encoding.ASCII
,并查看其对版权符号的作用......
答案 1 :(得分:1)
以这种方式保存一些立陶宛字符时遇到了同样的问题。我找到了一种方法来欺骗这种方法,将&
替换为&
(&#x00A9;
以写©
等等)它看起来很奇怪,但它对我有用:)
答案 2 :(得分:0)
也许您可以尝试不同的文档编码,请查看: http://www.sagehill.net/docbookxsl/CharEncoding.html
答案 3 :(得分:0)
似乎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;");