C#XmlSerializer强制编码类型为ISO-8859-1

hub*_*ber 3 c# encoding xml-serialization

我正在尝试在序列化对象时将编码类型设置为ISO-8859-1.代码运行时不会抛出任何异常,但返回的编码类型始终设置为"UTF-16".我搜索了很多例子,有100个样本,但我根本无法强制所需的编码类型.

我的问题是如何强制它将编码设置为ISO-8859-1?

提前致谢.

代码是:

XmlWriterSettings xmlWriterSettings = new XmlWriterSettings
{
    Indent = true,
    OmitXmlDeclaration = false,
    Encoding = Encoding.GetEncoding("ISO-8859-1")
};

using (var stringWriter = new StringWriter())
{
    using (var xmlWriter = XmlWriter.Create(stringWriter, xmlWriterSettings))
    {
        serializer.Serialize(xmlWriter, obj, ns);
    }

    return stringWriter.ToString();
}
Run Code Online (Sandbox Code Playgroud)

Tho*_*que 11

当你写XML的TextWriter(例如StringWriter,StreamWriter),它总是使用由指定的编码TextWriter,并忽略指定的一个XmlWriterSettings.因为StringWriter,编码总是UTF-16,因为这是.NET字符串在内存中使用的编码.

解决方法是写入a MemoryStream并从那里读取字符串:

var encoding = Encoding.GetEncoding("ISO-8859-1");
XmlWriterSettings xmlWriterSettings = new XmlWriterSettings
{
    Indent = true,
    OmitXmlDeclaration = false,
    Encoding = encoding
};

using (var stream = new MemoryStream())
{
    using (var xmlWriter = XmlWriter.Create(stream, xmlWriterSettings))
    {
        serializer.Serialize(xmlWriter, obj, ns);
    }
    return encoding.GetString(stream.ToArray());
}
Run Code Online (Sandbox Code Playgroud)

请注意,如果您在字符串中包含XML,则在将其写入文件时,您需要确保使用相同的编码进行编写.

  • @CiaranGallagher请不要编辑答案,只是为了使其符合您的个人风格偏好 (2认同)