You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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+环境需要先做编码注册:

  1. 安装NuGet包 System.Text.Encoding.CodePages
  2. 在项目启动入口(Program.cs)注册编码提供程序:
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
  1. 修改流读取代码的编码参数:
using var reader = new StreamReader(xmlFile.OpenReadStream(), Encoding.GetEncoding("ISO-8859-1"), true);
var strFile = await reader.ReadToEndAsync();

内容的提问来源于stack exchange,提问作者miska

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 06:57:03