Когда я пытаюсь загрузить файл, чье имя имеет символы с таких языков, как китайский японский и т. Д. …… не ascii … загруженное имя файла искажено. Как исправить это.
Я попытался поместить charset = UTF-8 в свойство заголовка Content-type, но не удался. Пожалуйста помоги. Код ниже.
header ("Cache-Control:"); // оставить пустым, чтобы избежать ошибок IE
header ("Pragma:"); // оставить пустым, чтобы избежать ошибок IE
header («Content-type: application / octet-stream»);
header ("Content-Disposition: attachment; filename = \" ". $ instance_name." \ "");
заголовок ( "Content-Length:". (строка) (размер файла ($ fileString)));
сон (1);
fpassthru ($ FDL);
К сожалению, в настоящее время не существует ни одного решения, которое работает со всеми браузерами. По этой проблеме существует по крайней мере три «более очевидных» подхода.
a) Content-type: application/octet-stream; charset=utf-8
Content-type: application/octet-stream; charset=utf-8
+ filename=<utf8 byte sequence>
например filename=Москва.txt
Это нарушение стандартов, но firefox показывает имя правильно. IE не делает.
б) Content-type: application/octet-stream; charset=utf-8
Content-type: application/octet-stream; charset=utf-8
+ filename=<urlencode(utf8 byte sequence)>
например 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/
edit: Когда я сказал, что нет единого решения, я имел в виду через заголовок («…»). Но есть что-то вроде работы.
Если нет имени файла filename = xyz, используйте базовое имя части пути к URL-адресу. Т.е. для <a href="test.php/lala.txt">
как firefox, так и IE предлагают lalala.txt
как имя файла.
Вы можете добавить дополнительные компоненты пути после фактического пути к вашему php-скрипту (при использовании httpd apache см. 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>
в вашем документе вы можете download/moskwa/...
и инициировать загрузку файла. Не отправляя никакое имя файла = …, оба Firefox и IE предлагают «правильное» имя.
Вы даже можете объединить его с отправкой имени в соответствии с rfc 2231. Вот почему я также поместил moskwa
в ссылку. Это будет идентификатор, используемый сценарием для поиска файла, который он должен отправить. IE игнорирует filename*=...
и по-прежнему использует базовую часть URL-адреса, чтобы предложить имя. Это означает, что для 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']; }
*) Это немного похоже на переполнение стека. Ссылка на этот вопрос показана как
http://stackoverflow.com/questions/2578349/while-downloading-filenames-from-non-english-languages-are-not-getting-displayed
но он также работает с
http://stackoverflow.com/questions/2578349/mary-had-a-little-lamb
важной частью является идентификатор 2578349
Я думаю, что если вы попытаетесь добавить другую кодировку, она исправит вас.
если вы все еще полагаете, что вам нужно установить языковые файлы с компакт-диска XP в вашу систему, потому что если система не может найти правильные символы, она добавит нечетные.
У меня была такая пролема с арабским языком, но я обнаружил, что не копировал все языковые файлы в свою систему.
Надеюсь, что это поможет вам.