PHP: RFC-2231 Как кодировать строку UTF-8 как имя файла Content-Disposition - PullRequest
5 голосов
/ 04 октября 2010

Сценарий: (в PHP) У меня есть отправка формы с кодированной строкой UTF-8 ($name) для поддержки международных символов. После отправки формы (через GET) я создаю файл загрузки CSV. Я хочу, чтобы имя файла было string + .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";
    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);
    }
    

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

1 Ответ

6 голосов
/ 07 сентября 2014

Достаточно кодировать имя файла в соответствии с RFC 3986 , используя rawurlencode ()

Так что все, что вам нужно сделать, это изменить заголовок ()строка:

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

Чтобы ответить на вопросы напрямую:

  1. Формат правильный, но текст внутри $ name должен быть закодирован с помощью rawurlencode () .
  2. rawurlencode () добивается цели.
...