小编Mic*_*son的帖子

PHP:RFC-2231如何将UTF-8字符串编码为Content-Disposition文件名

场景:(在PHP中)我有一个表单提交,其中包含UTF-8编码的字符串($name)以支持国际字符.在提交表单(通过GET)后,我正在创建一个CSV下载文件.我希望文件的名称是字符串 + .csv ("$name.csv").对于西方字符集,我可以通过以下方式做到这一点:

header("Content-Disposition: attachment; filename=\"$name\"");
Run Code Online (Sandbox Code Playgroud)

但对于其他字符集,下载文件的名称是垃圾字母 + .csv(例如×œ×œ× ×›×•×ª×¨×ª.csv).我试图遵循RFC 2231做类似的事情:

header("Content-Disposition: attachment; filename*=UTF-8''$name");
Run Code Online (Sandbox Code Playgroud)

但我似乎有几个问题:

  1. 浏览器似乎忽略了标题的" 文件名 "部分.我的格式合适吗?
  2. 我需要$name编码以十六进制编码的八位字节的每个字符,如" This%20is%20%2A%2A%2Afun%2A%2A%2A".有没有人有正确的功能?我编写了以下代码,但我不认为这是正确的:

    $fileName = encodeWordRfc2231($name) . ".csv";
    header("Content-Disposition: attachment; filename*=UTF-8''$fileName");
    
    function &encodeWordRfc2231($word) {
        $binArray = unpack("C*", $word);
        foreach ($binArray as $chr) {
            $hex_ary[] = '%' . sprintf("%02X", base_convert($chr, 2, 16));
        }
        return implode('', $hex_ary);
    }
    
    Run Code Online (Sandbox Code Playgroud)

有没有人有这方面的经验,可以让我走上正确的道路?

php content-disposition rfc2231

5
推荐指数
1
解决办法
7312
查看次数

标签 统计

content-disposition ×1

php ×1

rfc2231 ×1