XslCompiledTransform使用UTF-16编码。

13

我有下面这段代码,想要用UTF-8编码格式输出xml数据。但是它总是以UTF-16格式输出数据:

        XslCompiledTransform xslt = new XslCompiledTransform();

            xslt.Load(XmlReader.Create(new StringReader(xsltString), new XmlReaderSettings()));

            StringBuilder sb = new StringBuilder();

            XmlWriterSettings writerSettings = new XmlWriterSettings();
            writerSettings.Encoding = Encoding.UTF8;
            writerSettings.Indent = true;

            xslt.Transform(XmlReader.Create(new StringReader(inputXMLToTransform)), XmlWriter.Create(sb, writerSettings));
2个回答

15

XML输出将包含一个基于流编码而非设置中指定的编码的标头。由于字符串是16位Unicode,因此编码将为UTF-16。解决方法是抑制标头并自行添加:

writerSettings.OmitXmlDeclaration = true;

接着当您从 StringBuilder 获取结果时:

string xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n" + sb.ToString();

旧帖子,但我有一个问题。我尝试了这个方法,并且它适用于我的情况,但我想知道这个解决方法是否实际上改变了编码方式?我的使用是将一些XML数据发送到另一个系统。如果声明为utf-8,则该系统接受xml,但不接受utf-16。我感觉xml字符串的实际编码方式没有改变,我只是幸运地让它工作了。 - James Gardner
1
@JamesGardner:它不会改变编码,而是使头部与创建XML时实际使用的编码相匹配。 - Guffa

7
如果您使用MemoryStream代替StringBuilderXmlWriter将尊重您在XmlWriterSettings中指定的编码,因为MemoryStream没有像StringBuilder一样固有的编码。

还有一个方便的 https://dev59.com/Kk3Sa4cB1Zd3GeqPyt2_#2858095 - golfalot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接