C#处理XML乱码需统一XML声明、文件实际编码和读取编码。应先确认文件真实编码,再用XmlReaderSettings或StreamReader显式指定编码读取,保存时通过XmlWriterSettings设置编码并自动更新XML声明。

C#处理XML文件时出现乱码,通常是因为文件编码与读取时指定的编码不一致。关键在于确保XML声明中的encoding属性、文件实际编码、以及C#读取方式三者统一。
检查并确认XML文件的实际编码
XML文件开头的声明如只是提示,不代表文件真实编码。用记事本、VS Code或Notepad++打开文件,查看底部状态栏或通过“编码”菜单确认真实编码(如UTF-8无BOM、UTF-8 with BOM、GB2312、GBK等)。若声明为encoding="UTF-8"但文件实际是GBK,解析必然出错。
使用XmlReaderSettings指定编码(推荐)
避免依赖自动探测,显式控制编码更可靠:
- 创建XmlReaderSettings,设置Encoding属性为文件真实编码(如Encoding.GetEncoding("GBK"))
- 关闭DtdProcessing防止外部实体攻击(除非必需)
- 用XmlReader.Create(stream, settings)读取,而非直接传文件路径(避免FileStream默认编码干扰)
读取时统一用Stream + 显式编码构造StreamReader
如果用XDocument.Load()或XmlDocument.Load(),内部可能按系统默认编码解析。更稳妥的方式是:
本次升级更新内容:优化分类置顶功能处理机制;修复域名变化带来的cookie域问题;文件上传js的兼容ie9,ie10问题;更新内容编辑器版本;会员服务权限新增求购信息的发布总量限制,求购信息的每日发布量限制;新增供应信息的每日发布量限制;新增分类信息的审核机制控制;新增分类信息的每日发布量限制;新增分类信息的重发刷新功能;优化会员中心的服务类型内容;优化模板运行处理机制;优化会员商铺模板运行机制;
- 用FileStream打开文件
- 包装成StreamReader,明确指定编码(如new StreamReader(fileStream, Encoding.GetEncoding("GBK")))
- 再将StreamReader传给XDocument.Load()或XmlDocument.Load()
这样可绕过XML声明的影响,强制按指定编码解码字节流。
保存XML时注意编码一致性
用XDocument.Save()或XmlDocument.Save()写入时,默认使用UTF-8(无BOM)。若需其他编码(如GBK),应:
- 创建XmlWriterSettings,设置Encoding = Encoding.GetEncoding("GBK")
- 调用XmlWriter.Create(filePath, settings)
- 再用XDocument.Save(writer)输出
此时生成的XML文件会以指定编码保存,且XML声明中的encoding属性也会自动更新匹配。






