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不支持繁体字。几类编码方式的资料如下,

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

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

GB18030全称是《信息技术中文编码字符集》,于2000年 3月17日发布,是我国制订的以汉字为主并包含多种我国少数民族文字的超大型中文编码字符集强制性标准,其中收入汉字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编码吧,解决了此问题。

读取gb2312编码的xml失败问题分析相关推荐

  1. pugixml读取unicode编码的xml文件的做法

    作者:朱金灿 来源:http://blog.csdn.net/clever101 实际上在多字节编码的情况下,即以记事本打开显示的ANSI编码的,如下图: pugixml是可以直接读取中文字符的,示例 ...

  2. 关于gb2312编码的xml解析

    在ios项目中遇到这样一个问题,需要读取远程的xml文件,进行解析,但是目标xml是gb2312编码的,用System.Text.Encoding.GetEncoding("gb2312&q ...

  3. tinyxml 读取文本节点_在Windows下使用TinyXML-2读取UTF-8编码包含中文字符的XML文件...

    TinyXML-2 是一个用 C++ 开发的小巧.高效的 XML 解析工具,它在 GitHub 网站上的链接为: https://github.com/leethomason/tinyxml2 .它的 ...

  4. unicode编码转gb2312编码并显示中文(cjava)

    unicode编码转gb2312编码并显示中文(c&java) unicode编码与gb2312编码没有线性关系,只能通过使用编码表的方式查找. C语言 编码表中,前半部分是gb2312编码, ...

  5. Ajax 中XmlHttp 乱码 的解决方法 (UTF8,GB2312 编码 解码)

    51ajax.comAJAX论坛 用XMLHTTP Post  Form时的表单乱码有两方面的原因--Post表单数据时中文乱码:服务器Response被XMLHTTP不正确编码引起的乱码.换句话说, ...

  6. ajax 文件数据流,Ajax如何读取数据流中的xml文件?

    Ajax如何读取数据流中的xml文件? 这是我的源代码,请大家帮忙看看,我读到的怎么都是空值.是不是方法错了? var xmlHttp; function createXMLHttpRequest() ...

  7. java解析xml实例_在java中使用dom解析xml的示例分析

    本篇文章介绍了,在java中使用dom解析xml的示例分析.需要的朋友参考下 dom是个功能强大的解析工具,适用于小文档 为什么这么说呢?因为它会把整篇xml文档装载进内存中,形成一颗文档对象树 总之 ...

  8. .net core中不支持GB2312编码的问题

    今天在用core实现读取文件内容时出现了中文乱码的问题,特此记录下. 代码如下: static void Main(string[] args){string path = "F:\\1.t ...

  9. 数据库零碎---mysql编码设置,与乱码分析

    一般来说,乱码的出现有2种原因,首先是由于编码(charset)设置错误,导致浏览器以错误的编码来解析,从而出现了满屏乱七八糟的"天书", 其次是文件被以错误的编码打开,然后保存, ...

最新文章

  1. Java学习总结:30
  2. 信息安全系统设计基础第十五周总结
  3. Jenkins持续集成环境之tomcat的安装和配置
  4. IDEA快捷键的使用成就手速之旅(要想手速变得快,快捷练习必须刚)
  5. oracle solaris翻译,详解Oracle云操作系统Solaris 11.2
  6. 超简单集成Android Zxing实现扫一扫二维码
  7. ios 获取沙盒文件名_iOS 获取沙盒文件路径及 写入/删除 沙盒文件
  8. 2-PHP代码审计——PHPCMSV9.6.0 sql注入漏洞
  9. 华为设备BFD实战,双向转发检测BFD详解,理论+实战+抓包分析
  10. Good Luck in CET-4 Everybody! (巴什博弈 bash game)
  11. 在内核中之获取HKEY_CURRENT_USER对应路径
  12. 让设计师哭笑不得的文案
  13. Python下载网易云音乐歌单
  14. 量子计算与量子信息基础
  15. 华为、百度这些大公司都青睐哪些编程语言呢?
  16. 八字取名,你应该要考虑的7个实用建议
  17. 2018年笔试题——老虎证券1
  18. 静态图编程框架keras-学习心得以及知识点总结之keras的回调函数API
  19. 社交网站Quepasa以1亿美元收购myYearbook
  20. 2021牛客暑期多校训练营2-Girlfriend 计算几何

热门文章

  1. 重温经典:Python版飞机大战源码 神器 玩游戏就玩自己开发的
  2. uniapp 字符串转数组
  3. PEP8 - Python编码规范完整中文版
  4. 怎么看电脑安装python_查看电脑有没有安装Python的方法
  5. 服务器装2008系统蓝屏,Windows Server 2008 R2 Enterprise 服务器蓝屏 代码0x00000124 - Microsoft Community...
  6. 男女声分类研究及应用
  7. linux 安装icu库
  8. 学会SANGFOR隧道,我不用。哎,就是玩儿~
  9. 『Java安全』Unsafe类
  10. docker删除mysql