asp.net - http header 中非ascii值的当前状态?

标签 asp.net http utf-8 safari

我们有一位国际客户询问了一些 Safari 行为

Content-Disposition: attachment; filename=<customer file name>.pdf

我们没有测试我们的 pdf 书写功能的国际使用情况,他们看到 Safari 对他们来说表现得很奇怪。这让我今天开始了一场迷你冒险之旅。

具体来说,当客户在 Mac 上将 Safari 配置为英语时,我们的日文命名的 pdf 保存得很好(Asp.Net/IIS 的默认行为,将该字段序列化为原始 utf-8)。但是,当他们将浏览器配置为日语时,文件名显示为每个序列化的 utf-8 字符都被视为 Ascii。

一些快速的谷歌搜索得到了大量对 Rfc5987 和 Rfc8187 的引用以及这里和其他地方的许多帖子关于如何通过 vis Content-Disposition: filename=...

问题是很多帖子都来自 2007-2015 年。

我开始在最新的 Chrome 版本、最新的 Firefox 版本、IE 11 和 Edge 上尝试很多 Rfc5987/8187 实现建议(我手头没有带 Safari 的 Mac),这是我发现的:

  • IE11 和 Edge 将识别 filename= 是否经过 url 编码并对其进行解码。其他浏览器不会。
  • Mac 上的 IE11、Edge 和 Safari(配置为英文)将接受 filename= raw utf-8 并将其正确处理为日语名称
  • Safari(配置为日文)和Firefox 和Chrome 会将filename = raw utf-8 视为一串ascii 字符
  • 没有 浏览器 我已经实现了 Rfc5987/8187 中的任何一个。不是功能。

我试过了

  • 文件名=[url编码版本].pdf;
  • filename*=utf-8''[url encoded version].pdf(当小写字母不起作用时也是 UTF-8)
  • 文件名=[原始和 url 编码].pdf;文件名*=utf-8''[url编码].pdf

在我手边的所有浏览器中,只有文件名*值被完全忽略了。文件名=...; filename*= 将 ;filename*=... 运行到生成的文件名中。

简而言之,这 4 个浏览器中没有一个浏览器似乎实现了 Rfc 8187 的任何一点。

但我看到对 Asp.Net Core(我们目前不使用)的引用在他们的 ContentDispositionHeader 对象模型中有一个 FileNameStar 成员,所以这让我觉得一定有东西在实现 Rfc 8187。

但我看到的所有帖子似乎都在 2015 年左右逐渐消失,而且我在其中找到的所有内容似乎都无法在我可用的浏览器中运行。

有没有人对如何让浏览器在 Content-Disposition: filename= values 中处理国际字符集有更多的最新想法?

我的意思是,到目前为止,人们报告的唯一问题是 Firefox 和 Safari 配置为不是美国英语;在很多情况下,顺其自然似乎行之有效。

但如果知道如何“正确”地执行它会很好。

编辑:我尝试过的输出示例

Content-Disposition: attachment; filename*=utf-8''%e6%8e%a1%e7%94%a8%e3%81%ab%e9%96%a2%e3%81%99%e3%82%8b%e5%90%84%e7%a8%ae%e6%9b%b8%e9%a1%9e.pdf

没有浏览器正确读取。所有只是将“下载”替换为名称。

Content-Disposition: attachment; filename=Fred.pdf; filename*=utf-8''%e6%8e%a1%e7%94%a8%e3%81%ab%e9%96%a2%e3%81%99%e3%82%8b%e5%90%84%e7%a8%ae%e6%9b%b8%e9%a1%9e.pdf

所有测试的浏览器都生成了一个名为“Fred.pdf; filename*=utf-8''blahblahblah”的文件

Content-Disposition: attachment; filename="Fred.pdf"; filename*=utf-8''%e6%8e%a1%e7%94%a8%e3%81%ab%e9%96%a2%e3%81%99%e3%82%8b%e5%90%84%e7%a8%ae%e6%9b%b8%e9%a1%9e.pdf

同上例

还尝试使用 UTF-8 而不是 utf-8 进行上述所有操作。

谢谢

最佳答案

所有 当前的浏览器都实现了 RFC 8187 - 你可能做错了什么。如果您发布了一个由您的代码生成的示例字段值,将会很有帮助。

关于asp.net - http header 中非ascii值的当前状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55150633/

相关文章:

asp.net - 如何在带有母版页的页面中使用 PostbackUrl

c# - 无法将类型 'string' 隐式转换为 'System.Web.UI.WebControls.TextBox' 错误

PHP UTF8 邮件在 iPhone 邮件应用程序上出现乱码

Python 反转 UTF-8 字符串

ruby - 在使用 Mechanize 进行抓取时,我总是在 Ruby 2.0 中遇到 UndefinedConversionError

.net - ASP.MVC 3 安装错误

c# - ASP.NET MVC Action 过滤器

python - Python 中使用 JSON 数据的 HTTP PUT 请求

javascript - golang net/http上传大文件,未定义错误

php - 使用 HTTP 跨网站发送数据并在 HTTPS 中接收