如何根据RFC 2231在PHP中编码文件名? [英] How can I encode a filename in PHP according to RFC 2231?
本文介绍了如何根据RFC 2231在PHP中编码文件名?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
如何根据 MIME参数值和编码字的编码对文件名的值进行编码扩展:字符集,语言和延续(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),例如:
Note that this function expects that the output is used in a separate line preceded by a proper line wrap (i.e. CRLF), e.g.:
"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 Content-Disposition头字段的测试用例以及RFC 2047和RFC 2231/5987中定义的编码 。
这篇关于如何根据RFC 2231在PHP中编码文件名?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文