【问题标题】:XslCompiledTransform uses UTF-16 encodingXslCompiledTransform 使用 UTF-16 编码
【发布时间】:2011-03-14 18:37:12
【问题描述】:

我有以下代码,我想使用 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));

【问题讨论】:

    标签: c# .net xml encoding


    【解决方案1】:

    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 而不是 utf-16,则系统接受 xml。我觉得xml字符串的实际编码没有改变,我很幸运它可以工作。
    • @JamesGardner:它不会更改编码,它使标头与用于创建 XML 的实际编码匹配。
    【解决方案2】:

    如果您使用MemoryStream 代替StringBuilderXmlWriter 将遵循您在XmlWriterSettings 中指定的编码,因为MemoryStream 没有像@987654327 这样的固有编码@ 会。

    【讨论】:

    猜你喜欢
    • 2012-03-13
    • 2020-08-02
    • 2012-10-12
    • 2011-08-18
    • 1970-01-01
    • 1970-01-01
    • 2012-07-23
    • 2015-01-28
    • 2021-06-10
    相关资源
    最近更新 更多