首页 > 其他分享 >.Net 中实体类转换为XML字符串, 确保字符串头部是utf-8 不是utf-16

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

时间:2024-01-23 10:47:52浏览次数:15  
标签:XML 编码 utf MemoryStream XmlWriter 字符串

使用Utf8StringWriter或类似的方法来确保在序列化过程中使用正确的编码。然而,Utf8StringWriter不是.NET Core或.NET Standard库的一部分,因此你需要自己实现一个。

不过,有一种更简单的方法可以达到相同的效果,那就是使用StringWriterEncoding.GetEncoding("utf-8")结合,但这实际上并不正确,因为StringWriter总是使用UTF-16。正确的方法是使用MemoryStreamXmlWriter,这样你就可以指定XmlWriter的编码设置。

以下是一个使用MemoryStreamXmlWriter的示例,该示例将确保生成的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主要在文本文件中有用,而在字符串中通常不需要。

标签:XML,编码,utf,MemoryStream,XmlWriter,字符串
From: https://www.cnblogs.com/donethome/p/17981804

相关文章

  • js中的bigint类型转化为json字符串时报无法序列化的问题
    网上查了一下,解决这个问题的思路就是将bigint类型的数据转化为字符串,这样就能正确转化为json字符串了。对于一个是bigint的变量,直接使用toString方法就可以转化为字符串了,但是bigint变量在一个对象中,那么我们就需要一个更加通用的方法,网上看到一个很好的封装好的方法,如下。expor......
  • 字符串转化为toList
    certNameList="certNameList":"消防设施工程专业承包二级,地基基础工程专业承包一级,电子与智能化工程专业承包一级,建筑装修装饰工程专业承包一级,建筑幕墙工程专业承包一级",for(EntQualificationVOvo:entQualificationVOList){StringcertNameList......
  • 字符串相关
    可持久化trie树基本思想新加入一个字符串后,继承旧版本对应节点的儿子和其它信息,对字符串的每个字符新建节点。使用方法两个版本的trie树具有可减性,所以可以在静态问题加上区间、树链限制,完成trie树可以做的事,比如最大异或、k大异或、mex等。求解区间最大异或时,可以直......
  • 17、基于SLF4J中打印日志的方法,实现字符串中{}快速替换需要的内容
    转载自一、String工具类:publicclassStringUtils{privatestaticfinalcharDELIM_START='{';privatestaticfinalStringDELIM_STR="{}";privatestaticfinalcharESCAPE_CHAR='\\';/***基于slf4j中打印日志的......
  • 字符串
    1.力扣344-反转字符串第一个和倒数第一个交换,第二个和倒数第二个交换classSolution{publicvoidreverseString(char[]s){for(inti=0,j=s.length-1;i<j;i++,j--){chart=s[i];s[i]=s[j];s[j]=t;......
  • JS 数字字符串补零
    有时为了格式美观,我们需要给数字统一格式,比如001,002,003,这就有了为数字补足0的需求。具体见代码//num:数字//fill:补足后的位数padNumber(num,fill){letlen=(''+num).length;if(fill>len){//新建一个空数组,长度为所缺位数+1,利用join(0),得......
  • leedcode 找出字符串中第一个匹配项的下标
    自己写的classSolution:defstrStr(self,haystack:str,needle:str)->int:haystack_len=len(haystack)needle_len=len(needle)ifhaystack==needle:return0ifhaystack_len<needle_len:......
  • Python 字符串不可变性的优缺点
    随着计算机技术的快速发展,越来越多的编程语言被发明出来,每种编程语言都有自己独特的特点和优势。以我经常使用python写爬虫为例,在Python中,字符串是不可变的,这意味着一旦字符串被创建,就不能被修改。这与其他一些编程语言(如C++和Java)不同,在这些语言中,字符串是可以被修改的。对于......
  • #yyds干货盘点# LeetCode程序员面试金典:反转字符串中的单词 III
    题目给定一个字符串s,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。 示例1:输入:s="Let'stakeLeetCodecontest"输出:"s'teLekatedoCteeLtsetnoc"示例2:输入:s="MrDing"输出:"rMgniD"代码实现classSolution{publicString......
  • Go语言核心36讲 37 | strings包与字符串操作
    在上一篇文章中,我介绍了Go语言与Unicode编码规范、UTF-8编码格式的渊源及运用。Go语言不但拥有可以独立代表Unicode字符的类型rune,而且还有可以对字符串值进行Unicode字符拆分的for语句。除此之外,标准库中的unicode包及其子包还提供了很多的函数和数据类型,可以帮助我们解析各......