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

.NET Core API下载Excel时挪威语特殊字符被替换为下划线

.NET Core API下载含特殊字符文件名Excel乱码问题

问题表现

接口下载Excel文件时,文件名中包含的挪威语特殊字符(ø/æ/ä/å/ö/õ)全部被替换为下划线,核心实现代码:

var filename = doc.Name + Path.GetExtension(filePath);
// 预期文件名:Name øæäåöõ.xlsx
var contentType = doc.ContentType;
return File(stream, contentType, filename, modifiedTime, null);
  • 预期结果:下载得到文件名为Name øæäåöõ.xlsx
  • 实际结果:下载得到文件名为Name ______.xlsx
  • 已尝试操作:参考社区方案手动添加Content-Disposition响应头,问题未解决
  • Chrome中查看的响应头截图:
    Chrome响应头信息

修复方法

问题核心是两个配置缺失,按以下步骤修改即可:

  1. 先在服务配置阶段放开非ASCII字符的编码限制,在Program.cs的控制器服务注册代码中添加编码配置,需要先引入System.Text.Encodings.Web和System.Text.Unicode命名空间:
builder.Services.AddControllers()
    .AddJsonOptions(opt =>
    {
        opt.JsonSerializerOptions.Encoder = JavaScriptEncoder.Create(UnicodeRanges.All);
    });
  1. 不要直接把原始文件名传入File()方法的下载文件名参数,也不要手动拼接Content-Disposition头,用框架内置的ContentDispositionHeaderValue类做标准编码,自动兼容各浏览器解析规则:
var contentDisposition = new ContentDispositionHeaderValue("attachment");
// FileNameStar 是RFC 5987标准定义的Unicode文件名字段,支持所有非ASCII字符
contentDisposition.FileNameStar = filename;
// 兼容不支持RFC 5987的旧浏览器
contentDisposition.FileName = Uri.EscapeDataString(filename);
Response.Headers.ContentDisposition = contentDisposition.ToString();
return File(stream, contentType);

手动拼接Content-Disposition头不生效的原因,基本都是没有正确设置FileNameStar字段,仅设置了仅支持ASCII编码的普通FileName字段,浏览器遇到非ASCII字符就会直接替换为下划线。使用框架内置的类型处理编码,不需要自己处理转义逻辑,不会出现格式不符合规范的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 20:54:19