6

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

header("Content-Disposition: attachment; filename=\"$name\"");

但对于其他字符集,下载文件的名称是垃圾字母+ .csv(如×œ×œ× ×›×•×ª×¨×ª.csv)。我正在尝试按照 RFC 2231 执行以下操作:

header("Content-Disposition: attachment; filename*=UTF-8''$name");

但我似乎有几个问题:

  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);
    }
    

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

4

1 回答 1

12

使用rawurlencode()根据RFC 3986对文件名进行编码就足够了

因此,您需要做的就是将 header() 行更改为:

header("Content-Disposition: attachment; filename*=UTF-8''".rawurlencode($name));

直接回答问题:

  1. 格式是正确的,但 $name 中的文本需要使用rawurlencode()进行编码。
  2. rawurlencode()可以解决问题。
于 2014-09-06T21:21:47.290 回答