首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么XmlWriter总是输出utf-16编码?

为什么XmlWriter总是输出utf-16编码?
EN

Stack Overflow用户
提问于 2012-02-27 09:58:10
回答 4查看 20.5K关注 0票数 34

我有这个扩展方法

    public static string SerializeObject<T>(this T value)
    {
        var serializer = new XmlSerializer(typeof(T));           
        var settings = new XmlWriterSettings
                       {
                        Encoding = new UTF8Encoding(true), 
                        Indent = false, 
                        OmitXmlDeclaration = false,
                        NewLineHandling = NewLineHandling.None
                       };

        using(var stringWriter = new StringWriter()) 
        {
            using(var xmlWriter = XmlWriter.Create(stringWriter, settings)) 
            {
                serializer.Serialize(xmlWriter, value);
            }

            return stringWriter.ToString();
        }
    }

但是每当我调用它的时候,它都有一个指定的utf-16编码,即<?xml version="1.0" encoding="utf-16"?>。我做错了什么?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-02-27 10:25:40

字符串采用UTF-16格式,因此写入StringWriter时将始终使用UTF-16格式。如果这不是您想要的,那么使用其他TextWriter派生类,并使用您喜欢的编码。

票数 25
EN

Stack Overflow用户

发布于 2012-02-27 10:03:50

据我所知,当序列化为字符串时,StringWriter类总是使用UTF16编码。您可以编写自己的覆盖类,接受不同的编码:

public class StringWriterWithEncoding : StringWriter
{
    private readonly Encoding _encoding;

    public StringWriterWithEncoding()
    {
    }

    public StringWriterWithEncoding(IFormatProvider formatProvider)
        : base(formatProvider)
    {
    }

    public StringWriterWithEncoding(StringBuilder sb)
        : base(sb)
    {
    }

    public StringWriterWithEncoding(StringBuilder sb, IFormatProvider formatProvider)
        : base(sb, formatProvider)
    {
    }


    public StringWriterWithEncoding(Encoding encoding)
    {
        _encoding = encoding;
    }

    public StringWriterWithEncoding(IFormatProvider formatProvider, Encoding encoding)
        : base(formatProvider)
    {
        _encoding = encoding;
    }

    public StringWriterWithEncoding(StringBuilder sb, Encoding encoding)
        : base(sb)
    {
        _encoding = encoding;
    }

    public StringWriterWithEncoding(StringBuilder sb, IFormatProvider formatProvider, Encoding encoding)
        : base(sb, formatProvider)
    {
        _encoding = encoding;
    }

    public override Encoding Encoding
    {
        get { return (null == _encoding) ? base.Encoding : _encoding; }
    }
}

因此,您可以使用下面的代码:

using(var stringWriter = new StringWriterWithEncoding( Encoding.UTF8))
{
   ...
}
票数 23
EN

Stack Overflow用户

发布于 2012-02-27 10:11:12

您应该从具有覆盖编码属性的StringWriter派生一个新类。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9459184

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档