场景:(在 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");
但我似乎有几个问题:
- 浏览器似乎忽略了标题的“文件名”部分。我的格式对吗?
我需要对
$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); }
有没有人有这方面的经验,可以让我走上正确的道路?