读取gb2312编码的xml失败问题分析

C#开发程序时,遇上了一个字符编码的大坑,记录一下,解决思路和解决方案供大家参考。

程序功能说明:

简化而言,程序需要从读取一个xml配置文件,在里面增添部分内容后,再次保存成一个新的xml配置文件。新配置文件最终要放在Linux服务器中,用libxml2库进行解析。

遇到的问题:

libxml2库解析时,报错encoding error:input conversion failed due to input error.最终导致XML parse error.如下图所示。

分析过程:

看报错应该是编码的问题,用VSCode查看程序输出的新配置文件,编码方式和xml文件头中的encoding均为GB2312编码。

这里发现有问题,因为原xml配置文件是GBK编码的,所以我写的代码中,默认保存的是用下面的语句,用Encoding.GetEncoding(“GBK”)指定了XElement保存的格式,保存文件的编码应该是GBK,为啥默认给我改成了GBK呢?这里的原因我们后面再说。

但是GB2312也是常见的中文编码格式,为啥linux系统就解析失败呢。下面再通过locale –a命令查看linux是否支持gb2312编码,如下图,输出也是支持的。

查看这里,暂时没有更多的头绪了。

那就再从报错入手吧。程序报错中其实指出了引起编码错误的几个字节0xD9 0x59 0xC8 0xDA,那我们就先来看看这几个字节对应的内容吧。在VSCode中,用十六进制打开xml文件,搜索到报错的几个字节。

再对比文本模式下的内容,发现居然有一个繁体字的“資”。这可是个重大发现,那会不会就是因为这个繁体字引起的呢。

马上去确认常见的几类中文编码方式的差异,确认gb2312不支持繁体字。几类编码方式的资料如下,

GB2312198151日开始实施的一套国家标准,通行于中国大陆,新加坡(新加坡也和大陆一样采用了简体中文)等地也采用此编码,共收录6763个汉字。不支持繁体中文。

GBK全称《汉字内码扩展规范》,1995121日制订,它是在GB2312-80标准基础上的内码扩展规范,使用了双字节编码方案,共收录了21003个汉字,完全兼容GB2312。支持了繁体中文。

GB18030全称是《信息技术中文编码字符集》,于2000 317发布,是我国制订的以汉字为主并包含多种我国少数民族文字的超大型中文编码字符集强制性标准,其中收入汉字70000余个。对GB 2312完全向后兼容,对GBK基本向后兼容

可以看到gb2312是最早的标准,只支持简体字,gbk是为了弥补gb2312仅支持简体的问题推出的,兼容gb2312的同时支持了繁体中文。Gb18030是最晚推出的标准,支持汉字最多,还支持少数民族文字。

那为啥C#会自动把GBK输出成gb2312呢,难道是它原生就不支持GBK编码,根据以下的demo试验,可以确认C#确实不支持GBK,仅支持gb2312和GB18030.

而且在https://github.com/dotnet/runtime/issues/43745上,还给出了理由,因为他们鼓励大家用unicode编码,这理由好像也说得过去。

而GB18030是个国内强制性标准,所以C#也支持了。那就改为使用GB18030编码吧,解决了此问题。

已标记关键词 清除标记
相关推荐
<p> <b><span style="background-color:#FFE500;">【超实用课程内容】</span></b> </p> <p> <br /> </p> <p> <br /> </p> <p> 本课程内容包含讲解<span>解读Nginx的基础知识,</span><span>解读Nginx的核心知识、带领学员进行</span>高并发环境下的Nginx性能优化实战,让学生能够快速将所学融合到企业应用中。 </p> <p> <br /> </p> <p style="font-family:Helvetica;color:#3A4151;font-size:14px;background-color:#FFFFFF;"> <b><br /> </b> </p> <p style="font-family:Helvetica;color:#3A4151;font-size:14px;background-color:#FFFFFF;"> <b><span style="background-color:#FFE500;">【课程如何观看?】</span></b> </p> <p style="font-family:Helvetica;color:#3A4151;font-size:14px;background-color:#FFFFFF;"> PC端:<a href="https://edu.csdn.net/course/detail/26277"><span id="__kindeditor_bookmark_start_21__"></span></a><a href="https://edu.csdn.net/course/detail/27216">https://edu.csdn.net/course/detail/27216</a> </p> <p style="font-family:Helvetica;color:#3A4151;font-size:14px;background-color:#FFFFFF;"> 移动端:CSDN 学院APP(注意不是CSDN APP哦) </p> <p style="font-family:Helvetica;color:#3A4151;font-size:14px;background-color:#FFFFFF;"> 本课程为录播课,课程永久有效观看时长,大家可以抓紧时间学习后一起讨论哦~ </p> <p style="font-family:"color:#3A4151;font-size:14px;background-color:#FFFFFF;"> <br /> </p> <p class="ql-long-24357476" style="font-family:"color:#3A4151;font-size:14px;background-color:#FFFFFF;"> <strong><span style="background-color:#FFE500;">【学员专享增值服务】</span></strong> </p> <p class="ql-long-24357476" style="font-family:"color:#3A4151;font-size:14px;background-color:#FFFFFF;"> <b>源码开放</b> </p> <p class="ql-long-24357476" style="font-family:"color:#3A4151;font-size:14px;background-color:#FFFFFF;"> 课件、课程案例代码完全开放给你,你可以根据所学知识,自行修改、优化 </p> <p class="ql-long-24357476" style="font-family:"color:#3A4151;font-size:14px;background-color:#FFFFFF;"> 下载方式:电脑登录<a href="https://edu.csdn.net/course/detail/26277"></a><a href="https://edu.csdn.net/course/detail/27216">https://edu.csdn.net/course/detail/27216</a>,播放页面右侧点击课件进行资料打包下载 </p> <p> <br /> </p> <p> <br /> </p> <p> <br /> </p>
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页