PHP ファイルをダウンロードする際に中国語のファイル名が文字化けする問題を解決する

WBOY
リリース: 2016-07-25 08:55:36
オリジナル
1184 人が閲覧しました
  1. $filename = "document.txt";
  2. header('Content-Type: application/octet-stream');
  3. header('Content-Disposition:attachment; filename=' . $ filename);
  4. print "Hello!";
  5. ?>
コードをコピー

ブラウザで開くと、document.txtをダウンロードできます。

ただし、$filename が UTF-8 でエンコードされている場合、一部のブラウザーはそれを適切に処理できません。

例:

  1. $filename = "中国語ファイル名.txt";
  2. header('Content-Type: application/octet-stream');
  3. header('Content-Disposition:attachment; filename= ' . $filename);
  4. print "Hello!";
  5. ?>
コードをコピー

プログラムをUTF-8エンコードで保存して再度アクセスすると、IE6でダウンロードしたファイル名が文字化けします。 FF3でダウンロードしたファイル名には「中国語」という単語しか入っていません。 Opera 9 ではすべて正常に動作します。

出力ヘッダー: Content-Disposition: 添付ファイル名=中文 filename.txt

実際、RFC2231 の定義によれば、多言語エンコーディングの Content-Disposition は次のように定義される必要があります。 コンテンツの配置: 添付ファイル名*="utf8''%E4%B8%AD%E6%96%87%20%E6%96%87%E4%BB%B6%E5%90%8D.txt" 今すぐ: ファイル名の後の等号は * で始まる必要があります。ファイル名の値は、文字セット (utf8)、言語 (空)、および URL コード化されたファイル名という 3 つのセグメントに一重引用符で囲まれて分割されます。二重引用符を追加することをお勧めします。それ以外の場合は、ファイル名のスペースの後の部分を追加します。 Firefoxでは表示されません。

urlencode の結果は、php の urlencode 関数の結果と同じではないことに注意してください。PHP の urlencode はスペースを + に置き換えますが、ここでは %20 に置き換える必要があります。

テストの結果、いくつかの主流ブラウザのサポートは次のとおりであることが判明しました。

  1. $filename = "中国語のファイル名.txt";
  2. $encoded_filename = urlencode($filename);
  3. $encoded_filename = str_replace("+", "%20", $encoded_filename) ;
  4. $ua = $_SERVER["HTTP_USER_AGENT"];
  5. header('Content-Type: application/octet-stream');
  6. if (preg_match("/MSIE/", $ua)) { // bbs.it -home.org
  7. header('Content-Disposition:attachment; filename="' . $encoded_filename . '"');
  8. } else if (preg_match("/Firefox/", $ua)) {
  9. header('Content -Disposition:attachment; filename*="utf8''' . $filename . '"');
  10. } else {
  11. header('Content-Disposition:attachment; filename="' . $filename . '"');
  12. }
  13. print 'ABC';
  14. ?>
コードをコピー


ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート