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?