при загрузке имен файлов с неанглийских языков не отображаются в загруженном файле правильно

Когда я пытаюсь загрузить файл, чье имя имеет символы с таких языков, как китайский японский и т. Д. …… не 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/&#x41c;&#x43e;&#x441;&#x43a;&#x432;&#x430;" > &#x41c;&#x43e;&#x441;&#x43a;&#x432;&#x430; </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'=>'&#x41c;&#x43e;&#x441;&#x43a;&#x432;&#x430;', 'content'=>'55° 45′ N, 37° 37′ O' ), 'athen'=>array( 'htmlentities'=>'&#x391;&#x3b8;&#x3ae;&#x3bd;&#x3b1;', '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 в вашу систему, потому что если система не может найти правильные символы, она добавит нечетные.

У меня была такая пролема с арабским языком, но я обнаружил, что не копировал все языковые файлы в свою систему.

Надеюсь, что это поможет вам.