PHP: RFC-2231 Как кодировать строку UTF-8 как имя файла Content-Disposition

Сценарий: (в 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 в шестнадцатеричном формате, например " This% 20is% 20% 2A% 2A% 2Afun% 2A% 2A% 2A ". У кого-нибудь есть функция, чтобы это правильно сделать? Я закодировал следующее, но не думаю, что это правильно:

     $ fileName = encodeWordRfc2231 ($ name). ".csv";
    заголовок ("Content-Disposition: attachment; filename * = UTF-8 '' $ fileName");
    
    function & encodeWordRfc2231 ($ word) {
     $ binArray = unpack ("C *", $ word);
     foreach ($ binArray как $ chr) {
    $ hex_ary [] = '%'. sprintf ("% 02X", base_convert ($ chr, 2, 16));
     }
     вернуть implode ('', $ hex_ary);
    }
    

Есть ли у кого-нибудь опыт в этом и может ли он направить меня на правильный путь?

5
задан Paul Wagland 31 May 2011 в 20:40
поделиться