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

Когда я пытаюсь загрузить файл, имя которого имеет символы с языков как китайские японцы и т.д..... не ASCII... загруженное имя файла искажено. Как исправить его.

Я попытался поместить charset=UTF-8 в свойство заголовка Типа контента, но никакой успех. Код ниже.

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);
7
задан Cœur 12 November 2018 в 05:25
поделиться

2 ответа

К сожалению, в настоящее время не существует единого решения, которое работало бы со всеми браузерами. Существует как минимум три "более очевидных" подхода к проблеме .

a) Тип содержимого: приложение / поток октетов; charset = utf-8 + filename = <последовательность байтов utf8>
например. filename = Москва.txt
Это нарушение стандартов, но Firefox показывает имя правильно. IE этого не делает.

b) Тип содержимого: приложение / поток октетов; charset = utf-8 + filename =
например. 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-адреса. Т.е. для и 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'] будет содержать / х / у / z .
Теперь, если вы поместите ссылку типа

<a
  href="/test.php/download/moskwa/&#x41c;&#x43e;&#x441;&#x43a;&#x432;&#x430;"
>
  &#x41c;&#x43e;&#x441;&#x43a;&#x432;&#x430;
</a>

в свой документ, вы можете получить часть download / moskwa / ... и начать загрузку файла. Без отправки информации filename = ... и Firefox, и IE предлагают "правильное" имя.
Вы даже можете комбинировать это с отправкой имени в соответствии с RFC 2231. Вот почему я также добавил moskwa в ссылку. Это будет идентификатор, который скрипт использует для поиска файла, который он должен отправить. IE игнорирует информацию filename * = ... и по-прежнему использует часть базового имени URL-адреса, чтобы предложить имя. Это означает, что для firefox (и любого другого клиента, поддерживающего rfc 2231) часть после идентификатора не имеет смысла *, но для 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'];
}

*) Это немного похоже на Stack Overflow. Ссылка на этот вопрос показана как

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

11
ответ дан 6 December 2019 в 23:04
поделиться

Я думаю, что если вы попытаетесь добавить другую кодировку, это исправит вашу проблему.

Если проблема не исчезла, я думаю, вам нужно установить языковые файлы с компакт-диска XP в вашу систему, потому что, если система не может найти нужные символы, она добавит нечетные.

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

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

0
ответ дан 6 December 2019 в 23:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: