• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

XML编码utf-8有中文无法解析或乱码C#

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

 

XML的encoding="UTF-8" ,含有中文的话(部分)会出现乱码。

 

网上还是很多这类问题跟解决办法的。

 

表现为用ie或者infopath之类的xml软件打不开这个xml,txt打开有时正常有时乱码。

 

 

 

当然C#也是无法解析的。

 

但是用ultraedit打开正常显示,用ultraedit保存为utf8后xml就一切正常了。

 

查询发现是bom的原因。

 

什么是BOM呢?

BOM:Byte Order Mark,中文名字节顺序标记。UCS规范建议在传输字节流前,先传输BOM来判断字节顺序。其实UTF-8是不需要用BOM来表明字节顺序的,但是可以用BOM来表明编码方式。BOM的UTF-8编码是EF BB BF,所以呢,如果接受者收到EF BB BF开头的字节流,就说明它是UTF-8编码了。

由此可见,对于UTF-8来说,BOM是可有可无的,可是,有的XML解析方式不认这个BOM,所以就报错了。

 

解决办法如下,强制把xml文本保存为utf8格式就好了

 

                                XmlDocument doc = new XmlDocument();
                                
                                string xmlString = ReadContext(tmpDir + "\\" + xml);

                                try
                                {
                                    doc.LoadXml(xmlString);
                                }
                                catch (Exception e)
                                {
                                    log.ErrorFormat(string.Format("Xml无法解析,名称:{1}, 格式错误,错误原因:{0}", e.Message, xml));
                                    continue;
                                }

ReadContext函数是把xml里的内容作为文本读出来,注意编码很重要,不能用default
System.Text.Encoding.UTF8
private static string ReadContext(string path)
        {
            FileStream fs = new FileStream(path, FileMode.Open);
            StreamReader sr = new StreamReader(fs,System.Text.Encoding.UTF8); 

string context = sr.ReadToEnd();
       fs.Close();
       sr.Close();
       sr.Dispose();
       fs.Dispose();

       return context;
     }

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
redis——学习之路五(简单的C#使用redis)发布时间:2022-07-13
下一篇:
C#中的Escape()和Unescape()发布时间:2022-07-13
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap