ASP.NET用Dropzone.js上传XML文件特殊字符显示乱码如何解决
乱码问题修复方案
问题原因
你上传的XML文件头部声明的编码为ISO-8859-1,但代码中读取文件流时强制指定了Encoding.UTF8编码,两种编码对特殊字符的字节解析规则不匹配,导致Ø这类特殊字符被解析为乱码替换符�,该问题在你调用ReadToEndAsync时就已经产生,和后续反序列化逻辑无关。
最优解决方案(推荐)
不要提前将文件流转为字符串,直接将文件流交给XmlSerializer反序列化,解析器会自动读取XML头部的encoding属性自动适配编码,无需手动处理编码规则,兼容性最好:
[HttpPost] public async Task<IActionResult> UploadXml(IFormFile xmlFile) { if (xmlFile == null || xmlFile.Length == 0) return await Task.FromResult((string)null); using var fileStream = xmlFile.OpenReadStream(); var serializer = new XmlSerializer(typeof(Catalog)); // 直接从流反序列化,自动适配XML声明的编码 var newXmlInvoice = (Catalog)serializer.Deserialize(fileStream); // 后续业务逻辑 }
备选方案(仅适用于固定ISO-8859-1编码场景)
如果你需要提前读取文件内容做字符串校验,可以手动指定编码读取,.NET Core/.NET 5+环境需要先做编码注册:
- 安装NuGet包
System.Text.Encoding.CodePages - 在项目启动入口(Program.cs)注册编码提供程序:
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
- 修改流读取代码的编码参数:
using var reader = new StreamReader(xmlFile.OpenReadStream(), Encoding.GetEncoding("ISO-8859-1"), true); var strFile = await reader.ReadToEndAsync();
内容的提问来源于stack exchange,提问作者miska
相关产品推荐
相关产品推荐

