6

シナリオ: (PHP の場合)国際文字をサポートするために、 UTF-8でエンコードされた文字列 ( ) を含むフォームを送信しています。$nameフォームを (GET 経由で) 送信すると、CSV ダウンロード ファイルが作成されます。ファイルの名前をその文字列+ .csv ( "$name.csv") にしたい。西洋の文字セットの場合、次のようにすることでこれをうまく行うことができます。

header("Content-Disposition: attachment; filename=\"$name\"");

ただし、他の文字セットの場合、ダウンロード ファイルの名前はガベージ文字+ .csv( など×œ×œ× ×›×•×ª×¨×ª.csv) になります。私はRFC 2231に従って次のようなことをしようとしています:

header("Content-Disposition: attachment; filename*=UTF-8''$name");

しかし、私はいくつかの問題を抱えているようです:

  1. ブラウザは、ヘッダーの「filename」部分を無視しているようです。私のフォーマットは正しいですか?
  2. $name" " のように、16 進数でエンコードされたオクテットの各文字をエンコードする必要がありThis%20is%20%2A%2A%2Afun%2A%2A%2Aます。誰かがこれを適切に行う機能を持っていますか? 次のようにコーディングしましたが、正しくないと思います。

    $fileName = encodeWordRfc2231($name) . ".csv";
    header("Content-Disposition: attachment; filename*=UTF-8''$fileName");
    
    function &encodeWordRfc2231($word) {
        $binArray = unpack("C*", $word);
        foreach ($binArray as $chr) {
            $hex_ary[] = '%' . sprintf("%02X", base_convert($chr, 2, 16));
        }
        return implode('', $hex_ary);
    }
    

誰かがこれを経験していて、私を正しい道に導くことができますか?

4

1 に答える 1

12

rawurlencode()を使用して、 RFC 3986に従ってファイル名をエンコードするだけで十分です。

したがって、必要なことは、header() 行を次のように変更することだけです。

header("Content-Disposition: attachment; filename*=UTF-8''".rawurlencode($name));

質問に直接答えるには:

  1. フォーマットは正しいですが、 $name 内のテキストはrawurlencode()でエンコードする必要があります。
  2. rawurlencode()はトリックを行います。
于 2014-09-06T21:21:47.290 に答える