PHP: RFC-2231 UTF-8-Zeichenfolge als Inhaltsdisposition-Dateiname codieren

Scenario: (in PHP) Ich habe eine Formularübermittlung mit einem UTF-8 codierte Zeichenfolge $name) zur Unterstützung internationaler Zeichen. Nach dem Absenden des Formulars (über GET) erstelle ich eine CSV-Download-Datei. Ich möchte, dass der Name der Datei @ is string + .csv ("$name.csv"). Für einen westlichen Zeichensatz kann ich das ganz gut tun, indem ich Folgendes tue:

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

Aber für andere Zeichensätze lautet der Name der Download-Datei Müllbuchstaben + .csv (sowie×œ×œ× ×›×•×ª×¨×ª.csv). Ich versuche, RFC 2231 zu folgen, um etwas zu tun wie:

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

Aber ich scheine ein paar Probleme zu haben:

Browser scheint das "Dateinam "Teil der Kopfzeile. Stimmt mein Format?

Ich muss jedes Zeichen von @ codier$name Oktette hexadezimal codiert, wie "This%20is%20%2A%2A%2Afun%2A%2A%2A ". Hat jemand eine Funktion, um dies richtig zu machen? Ich habe Folgendes codiert, denke aber nicht, dass es richtig ist:

$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);
}

Hat da draußen jemand Erfahrung damit und kann mich auf den richtigen Weg bringen?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage