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

ASP.NET Core 8.0 Web API返回CSV无法设置Windows-1256编码问题

问题:ASP.NET Core 8.0 Web API返回Windows-1256编码的波斯文CSV乱码

需求:通过ASP.NET Core 8.0 Web API的Action返回包含波斯文字符的CSV文件,以FileContentResult形式输出,编码为Windows-1256。尝试了5种实现方案均未成功,生成的CSV内容乱码,用Notepad++打开时编码显示为UTF-8而非目标的Windows-1256。运行环境为Windows 10 + .NET 8.0。

失败的尝试代码

using Microsoft.AspNetCore.Mvc;
using System.Text;

namespace WebApplication.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class TestController : ControllerBase
    {
        [HttpGet("attempt1")]
        public IActionResult GetCsv()
        {
            var csvData = "لورم ایپسوم متن ساختگی با تولید سادگی نامفهوم از صنعت چاپ، و با استفاده از طراحان گرافیک است .";

            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
            var encoding = Encoding.GetEncoding("windows-1256");
            var bytes = encoding.GetBytes(csvData);

            return File(bytes, "text/csv", "persian.csv");
        }

        [HttpGet("attempt2")]
        public IActionResult GetCsv2()
        {
            var csvData = "لورم ایپسوم متن ساختگی با تولید سادگی نامفهوم از صنعت چاپ، و با استفاده از طراحان گرافیک است .";

            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
            var encoding = Encoding.GetEncoding(1256);
            var bytes = encoding.GetBytes(csvData);

            return File(bytes, "text/csv", "persian.csv");
        }

        [HttpGet("attempt3")]
        public IActionResult GetCsv3()
        {
            var csvData = "لورم ایپسوم متن ساختگی با تولید سادگی نامفهوم از صنعت چاپ، و با استفاده از طراحان گرافیک است .";

            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
            var encoding = Encoding.GetEncoding("windows-1256");
            var bytes = encoding.GetBytes(csvData);

            Response.Headers.Add("Content-Disposition", "attachment; filename=persian.csv");
            Response.ContentType = "text/csv; charset=windows-1256";

            return File(bytes, "text/csv", "persian.csv");
        }

        [HttpGet("attempt4")]
        public IActionResult GetCsv4()
        {
            var csvData = "لورم ایپسوم متن ساختگی با تولید سادگی نامفهوم از صنعت چاپ، و با استفاده از طراحان گرافیک است .";

            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
            var destEncoding = Encoding.GetEncoding("windows-1256");

            var bytes = Encoding.Convert(Encoding.UTF8, destEncoding, Encoding.UTF8.GetBytes(csvData));

            return File(bytes, "text/csv", "persian.csv");
        }

        [HttpGet("attempt5")]
        public IActionResult GetCsv5()
        {
            var csvData = "لورم ایپسوم متن ساختگی با تولید سادگی نامفهوم از صنعت چاپ، و با استفاده از طراحان گرافیک است .";

            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
            var encoding = Encoding.GetEncoding("windows-1256");
            
            var preamble = encoding.GetPreamble();
            var bytes = encoding.GetBytes(csvData);

            var fileContent = new byte[preamble.Length + bytes.Length];
            System.Buffer.BlockCopy(preamble, 0, fileContent, 0, preamble.Length);
            System.Buffer.BlockCopy(bytes, 0, fileContent, preamble.Length, bytes.Length);

            return File(fileContent, "text/csv", "persian.csv");
        } 
    }
}

解决方案

核心问题在于未在响应的Content-Type中明确指定charset,导致客户端(浏览器/编辑器)默认以UTF-8解析Windows-1256编码的字节流,从而出现乱码。此外,部分尝试中存在响应头被覆盖的问题。

正确实现代码

using Microsoft.AspNetCore.Mvc;
using System.Text;

namespace WebApplication.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class TestController : ControllerBase
    {
        [HttpGet("correct-csv")]
        public IActionResult GetCorrectCsv()
        {
            var csvData = "لورم ایپسوم متن ساختگی با تولید سادگی نامفهوم از صنعت چاپ، و با استفاده از طراحان گرافیک است .";

            // 注册代码页编码提供器,.NET Core默认不包含非UTF8编码
            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
            var targetEncoding = Encoding.GetEncoding("windows-1256");

            // 将字符串转换为Windows-1256编码的字节数组
            var csvBytes = targetEncoding.GetBytes(csvData);

            // 关键:Content-Type必须指定charset=windows-1256,告知客户端使用正确编码解析
            return File(
                fileContents: csvBytes,
                contentType: "text/csv; charset=windows-1256",
                fileDownloadName: "persian.csv"
            );
        }
    }
}

关键说明

  1. 注册CodePagesEncodingProvider:.NET Core默认仅包含UTF-8、UTF-16等通用编码,Windows-1256属于代码页编码,必须通过Encoding.RegisterProvider注册才能使用。
  2. 明确指定Content-Type的charset:返回File时,contentType参数必须写成text/csv; charset=windows-1256,这是让客户端识别编码的核心。之前的尝试仅用text/csv,客户端会默认用UTF-8解析。
  3. 无需添加BOM:Windows-1256编码没有字节顺序标记(BOM),添加空的preamble不会改变编辑器的编码检测结果,反而可能造成干扰。
  4. 避免重复设置响应头:File方法会自动设置Content-Disposition和Content-Type,无需手动添加,否则可能出现覆盖或冲突。

验证方式

下载文件后,用Notepad++打开:

  • 点击「编码」菜单,选择「Windows-1256」,即可正常显示波斯文字符;
  • 若编辑器自动检测为UTF-8,可手动切换编码查看,或确认响应头中的Content-Type是否正确返回了charset=windows-1256。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 11:50:57