如何编码文件名以供下载?

当文件名是“Algunas MARCAS quenosacompañan”时,当我尝试下载该文件时,ASP.NET MVC会引发System.FormatException 。 但如果文件名是“Asistente de Gerencia Comercial”则不然。

我想这是因为与UTF-8编码相关的东西,但我不知道如何编码该字符串。

如果我是对的,我怎么能用UTF-8编码对字符串进行编码? 如果我不对,我的问题是什么?

我编码这样的文件名下载,

 HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment;filename= " + HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8)); 

根据ZZ Coder的回答,因为我正在使用FileResult,所以我决定将文件名编码为:

 HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8) 

这个问题已为人所知多年。 据我所知,目前还没有可互操作的方法,所以答案是只支持一组浏览器,或者进行用户代理嗅探。

测试用例和链接: http : //greenbytes.de/tech/tc2231/

另外:HttpUtility被认为是有害的:
http://serialseb.blogspot.com/2008/03/httputilityurlencode-considered-harmful.html

我只是打算用“_”替换“”,并称之为“=”

我最近对此进行了一些争论,有许多潜在的语言被用于文件名(中文很适合测试)。 这是我最终得到的结果(排除其他实施细节):

 HttpUtility.UrlEncode("é", System.Text.Encoding.GetEncoding("ISO-8859-1")) 

请注意,使用UTF编码文件名中的空格替换为“+”,使用以下代码生成相同的结果:

 HttpUtility.UrlEncode("é", System.Text.Encoding.GetEncoding("ISO-8859-1")) HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8) 

而不是使用httpUtility用“+”替换文件名中的空格使用以下代码解决问题:

 string attachment = String.Format("attachment; filename={0}",Server.UrlPathEncode(file.Name.TrimEnd())); Response.AddHeader("Content-Disposition", attachment); 

请注意,如果您从数据集中检索文件名,则可能需要先修改名称! 您还必须提前添加以下代码行:

 Response.Charset = "utf-8"; Response.HeaderEncoding = UnicodeEncoding.UTF8; Response.ContentEncoding = UnicodeEncoding.UTF8;