3

MIME パラメータ値とエンコードされた単語の拡張子: Character Sets, Languages, and Continuations (RFC 2231)のエンコーディングに従って、ファイル名の値をエンコードするにはどうすればよいですか?

4

1 に答える 1

2

私はこれがそれを行うべきだと思います:

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 Content-Disposition ヘッダー フィールドのテスト ケースと、RFC 2047 および RFC 2231/5987 で定義されているエンコーディングも参照してください。

于 2011-02-11T12:11:11.253 に答える