烨哥 发表于 2024-1-23 10:19:31

.Net 中实体类转换为XML字符串, 确保字符串头部是utf-8 不是utf-16

使用Utf8StringWriter或类似的方法来确保在序列化过程中使用正确的编码。然而,Utf8StringWriter不是.NET Core或.NET Standard库的一部分,因此你需要自己实现一个。
不过,有一种更简单的方法可以达到相同的效果,那就是使用StringWriter与Encoding.GetEncoding("utf-8")结合,但这实际上并不正确,因为StringWriter总是使用UTF-16。正确的方法是使用MemoryStream与XmlWriter,这样你就可以指定XmlWriter的编码设置。
以下是一个使用MemoryStream和XmlWriter的示例,该示例将确保生成的XML具有utf-8编码:
public static string SerializeObjectToXml<T>(T toSerialize)
{
    XmlSerializer xmlSerializer = new XmlSerializer(toSerialize.GetType());

    using (MemoryStream memoryStream = new MemoryStream())
    {
      // 使用UTF-8编码和无BOM的XmlWriterSettings
      XmlWriterSettings settings = new XmlWriterSettings
      {
            Encoding = Encoding.UTF8,
            Indent = true, // 可选的,如果你想要格式化的XML
            OmitXmlDeclaration = false, // 可选的,如果你想要包含XML声明
      };

      using (XmlWriter xmlWriter = XmlWriter.Create(memoryStream, settings))
      {
            xmlSerializer.Serialize(xmlWriter, toSerialize);
      }

      // 将MemoryStream的内容转换为UTF-8字符串
      return Encoding.UTF8.GetString(memoryStream.ToArray());
    }
}在这个例子中,XmlWriterSettings被配置为使用UTF-8编码,并且创建的XmlWriter实例被传递给XmlSerializer.Serialize方法。序列化完成后,MemoryStream的内容被转换为UTF-8编码的字符串。
请注意,如果你想要生成的XML不包含BOM(字节顺序标记),上面的代码已经满足了这个要求,因为.NET Core中的Encoding.UTF8默认不产生BOM。如果你确实需要BOM,你需要使用new UTF8Encoding(true)来创建编码实例,但这通常不是必要的,因为BOM主要在文本文件中有用,而在字符串中通常不需要。

来源:https://www.cnblogs.com/donethome/p/17981804
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: .Net 中实体类转换为XML字符串, 确保字符串头部是utf-8 不是utf-16