当我试图下载一个名字中包含中文日语等字符的文件时....非ascii ...下载的文件名是乱码.如何纠正它.
我试图将charset = UTF-8放在Content-type标头属性中,但没有成功.代码如下.
header("Cache-Control: ");// leave blank to avoid IE errors
header("Pragma: ");// leave blank to avoid IE errors
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"".$instance_name."\"");
header("Content-length:".(string)(filesize($fileString)));
sleep(1);
fpassthru($fdl);
Run Code Online (Sandbox Code Playgroud)
Vol*_*erK 11
不幸的是,目前没有一种解决方案适用于所有浏览器.这个问题至少有三种"更明显"的方法.
a)Content-type: application/octet-stream; charset=utf-8+ filename=<utf8 byte sequence>
例如,filename=??????.txt
这违反了标准,但firefox正确显示了名称.IE没有.
b) Content-type: application/octet-stream; charset=utf-8+ filename=<urlencode(utf8 byte sequence)>
eg filename=%D0%9C%D0%BE%D1%81%D0%BA%D0%B2%D0%B0.txt
这适用于IE但不适用于Firefox.
c)提供rfc 2231中指定的名称,
例如,filename*=UTF-8''%D0%9C%D0%BE%D1%81%D0%BA%D0%B2%D0%B0.txt
firefox支持这一点,IE不支持.
有关更全面的比较,请参阅http://greenbytes.de/tech/tc2231/
编辑:当我说没有单一解决方案时,我的意思是通过标题('...').但是有一些工作要做.
当没有可用的filename = xyz头时,浏览器使用url的路径部分的基名.即<a href="test.php/lala.txt">Firefox和IE建议lalala.txt作为文件名.
您可以在php脚本的实际路径之后附加额外的路径组件(当使用apache的httpd时,请参阅http://httpd.apache.org/docs/2.1/mod/core.html#acceptpathinfo).
例如,如果文档根目录中有文件test.php,则请求http://localhost/test.php/x/y/z变量$_SERVER['PATH_INFO']将包含该文件/x/y/z.
现在,如果你输入一个类似的链接
<a
href="/test.php/download/moskwa/Москва"
>
Москва
</a>
Run Code Online (Sandbox Code Playgroud)
在您的文档中,您可以获取该download/moskwa/...部件并启动该文件的下载.没有发送任何文件名= ...信息,Firefox和IE都提示"正确"的名称.
您甚至可以将它与根据rfc 2231发送名称结合起来.这就是我也moskwa加入链接的原因.这将是脚本用于查找应该发送的文件的id.IE忽略该filename*=...信息,仍然使用url的basename部分来建议名称.这意味着对于firefox(以及支持rfc 2231的任何其他客户端),id之后的部分毫无意义*但对于IE(以及其他不支持rfc 2231的客户端),它将用于名称建议.
自包含的例子:
<?php // test.php
$files = array(
'moskwa'=>array(
'htmlentities'=>'Москва',
'content'=>'55° 45? N, 37° 37? O'
),
'athen'=>array(
'htmlentities'=>'Αθήνα',
'content'=>'37° 59? N, 23° 44? O'
)
);
$fileid = null;
if ( isset($_SERVER['PATH_INFO']) && preg_match('!^/download/([^/]+)!', $_SERVER['PATH_INFO'], $m) ) {
$fileid = $m[1];
}
if ( is_null($fileid) ) {
foreach($files as $fileid=>$bar) {
printf(
'<a href="./test.php/download/%s/%s.txt">%s</a><br />',
$fileid, $bar['htmlentities'], $bar['htmlentities']
);
}
}
else if ( !isset($files[$fileid]) ) {
echo 'no such file';
}
else {
$f = $files[$fileid];
$utf8name = mb_convert_encoding($f['htmlentities'], 'utf-8', 'HTML-ENTITIES');
$utf8name = urlencode($utf8name);
header("Content-type: text/plain");
header("Content-Disposition: attachment; filename*=UTF-8''$utf8name.txt");
header("Content-length: " . strlen($f['content']));
echo $f['content'];
}
Run Code Online (Sandbox Code Playgroud)
*)这有点像在Stack Overflow上.此问题的链接显示为
http://stackoverflow.com/questions/2578349/while-downloading-filenames-from-non-english-languages-are-not-getting-displayed
Run Code Online (Sandbox Code Playgroud)
但它也适用
http://stackoverflow.com/questions/2578349/mary-had-a-little-lamb
Run Code Online (Sandbox Code Playgroud)
重要的是id 2578349