ホームページ > バックエンド開発 > PHPの問題 > PHPファイルのダウンロードのファイル名が文字化けしている場合の対処方法

PHPファイルのダウンロードのファイル名が文字化けしている場合の対処方法

藏色散人
リリース: 2023-03-17 08:06:01
オリジナル
2192 人が閲覧しました

PHP ファイル ダウンロードのファイル名が文字化けする場合の解決策: 1. "Content-Type" を "application/octet-stream" に設定します; 2. Set "header('Content-Disposition:attachment; filename*= "utf8\'\'' . $filename . '"');} else {header(...)" で十分です。

PHPファイルのダウンロードのファイル名が文字化けしている場合の対処方法

このチュートリアルの動作環境: Windows 7 システム、PHP バージョン 8.1、Dell G3 コンピューター。

php ファイルのダウンロード ファイル名が文字化けする場合の対処方法

PHP ダウンロード ファイル名が文字化けする

Content-Type を application/ に設定することで、 octet-stream を使用すると、動的に生成されたコンテンツをファイルとしてダウンロードできます。これは誰もが知っていると思います。次に、Content-Disposition を使用して、ダウンロードしたファイル名を設定します。これは多くの人が知っています。基本的に、ダウンロード プログラムは次のように記述されます。

コードは次のとおりです。

$filename = "document.txt";
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . $filename);
print "Hello!";
ログイン後にコピー

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

ただし、$filename が UTF-8 でエンコードされている場合、一部のブラウザではそれを適切に処理できません。たとえば、上記のプログラムを少し変更します。

コードは次のとおりです。

$filename = "中文 文件名.txt";
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . $filename);
print "Hello!";
ログイン後にコピー

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

出力ヘッダーは実際には次のようになります:

Content-Disposition:attachment;filename=中国語のファイル名.txt 実際、RFC2231 の定義によれば、多言語エンコーディング Content-性質は次のように定義する必要があります:

コードは次のとおりです:

Content-Disposition: attachment; filename*="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 スペースは置き換えられますが、ここでは

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

IE6 attachment; filename=""
FF3 attachment; filename="UTF-8文件名"
attachment; filename*="utf8''"
O9 attachment; filename="UTF-8文件名"
ログイン後にコピー

Safari3 (Win)は対応していないみたいでしょうか?上記の方法はどれも機能しません。

すべての主流ブラウザをサポートするには、プログラムを次のように記述する必要があるようです:

コードは次のとおりです:

$ua = $_SERVER["HTTP_USER_AGENT"];
$filename = "中文 文件名.txt";
$encoded_filename = urlencode($filename);
$encoded_filename = str_replace("+", "%20", $encoded_filename);
header('Content-Type: application/octet-stream');
if (preg_match("/MSIE/", $ua)) {
header('Content-Disposition: attachment; filename="' . $encoded_filename . '"');
} else if (preg_match("/Firefox/", $ua)) {
header('Content-Disposition: attachment; filename*="utf8\'\'' . $filename . '"');
} else {
header('Content-Disposition: attachment; filename="' . $filename . '"');
}
print 'ABC';
?>
ログイン後にコピー
推奨学習: "

PHP ビデオ チュートリアル >>

以上がPHPファイルのダウンロードのファイル名が文字化けしている場合の対処方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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