Как я могу кодировать имя файла в PHP в соответствии с RFC 2231?

Как я могу кодировать значение имени файла в соответствии с кодировкой значения параметра MIME и расширений кодированного слова: наборы символов, языки и контировки (RFC 2231) ?

Related of "Как я могу кодировать имя файла в PHP в соответствии с RFC 2231?"

Я думаю, это должно сделать это:

function rfc2231_encode($name, $value, $charset='', $lang='', $ll=78) { if (strlen($name) === 0 || preg_match('/[\x00-\x20*\'%()<>@,;:\\\\"\/[\]?=\x80-\xFF]/', $name)) { // invalid parameter name; return false; } if (strlen($charset) !== 0 && !preg_match('/^[A-Za-z]{1,8}(?:-[A-Za-z]{1,8})*$/', $charset)) { // invalid charset; return false; } if (strlen($lang) !== 0 && !preg_match('/^[A-Za-z]{1,8}(?:-[A-Za-z]{1,8})*$/', $lang)) { // invalid language; return false; } $value = "$charset'$lang'".preg_replace_callback('/[\x00-\x20*\'%()<>@,;:\\\\"\/[\]?=\x80-\xFF]/', function($match) { return rawurlencode($match[0]); }, $value); $nlen = strlen($name); $vlen = strlen($value); if (strlen($name) + $vlen > $ll-3) { $sections = array(); $section = 0; for ($i=0, $j=0; $i<$vlen; $i+=$j) { $j = $ll - $nlen - strlen($section) - 4; $sections[$section++] = substr($value, $i, $j); } for ($i=0, $n=$section; $i<$n; $i++) { $sections[$i] = " $name*$i*=".$sections[$i]; } return implode(";\r\n", $sections); } else { return " $name*=$value"; } } 

Обратите внимание, что эта функция ожидает, что вывод будет использоваться в отдельной строке, предшествующей правильному переносу строки (например, CRLF), например:

 "Content-Type: application/x-stuff;\r\n".rfc2231_encode('title', 'This is even more ***fun*** isn\'t it!', 'us-ascii', 'en', 48) 

Выход:

 Content-Type: application/x-stuff; title*0*=us-ascii'en'This%20is%20even%20more%20; title*1=%2A%2A%2Afun%2A%2A%2A%20isn%27t%20it! 

См. Также « Тестируемые случаи для заголовка содержимого HTTP-содержимого» и «Кодировки», определенные в RFC 2047 и RFC 2231/5987 .