Scenariusz: (w PHP) Mam do przesłania formularz z zakodowanym łańcuchem znaków ($name
), aby obsługiwać znaki międzynarodowe. Po przesłaniu formularza (przez GET) tworzę plik do pobrania CSV. Chcę, aby nazwa pliku była ta string + .csv
("$name.csv"
). Na zachodnim zestawem znaków można zrobić to dobrze wykonując:PHP: RFC-2231 Jak kodować ciąg znaków UTF-8 jako plik z nazwą zbioru?
header("Content-Disposition: attachment; filename=\"$name\"");
Ale dla innych zestawów znaków, nazwa pliku do pobrania jest litery śmieci + .csv
(takich jak ×œ×œ× ×›×•×ª×¨×ª.csv
). Staram się postępować zgodnie z RFC 2231, aby zrobić coś takiego:
header("Content-Disposition: attachment; filename*=UTF-8''$name");
Ale wydaje mi się mieć kilka problemów:
- Przeglądarka wydaje się ignorować „filename” część nagłówka. Czy mój format jest właściwy?
Potrzebuję kodować każdy znak oktetów kodowanych w systemie szesnastkowym, np. "
This%20is%20%2A%2A%2Afun%2A%2A%2A
". Czy ktoś ma funkcję, aby to zrobić właściwie? I kodowane następujących ale nie sądzę, że ma rację:$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); }
Czy ktoś tam ma doświadczenie z tym i może ustawić mnie na właściwą drogę?
Wewnętrznie PHP używa string-builderów dla łańcuchów, więc przechowywanie kawałków w '$ hex_ary' jest niepotrzebne. Powinieneś po prostu użyć '$ hex = '';' następnie dołączyć do niego każdy element. – manixrock
Zobacz http://stackoverflow.com/questions/4968272/how-can-i-encode-with-rfc-2231-a-filename-in-php – Gumbo