function encode_header($str, $position = 'text', $force = false)
 {
     $encode_charset = 'ISO-2022-JP';
     //ToDo: Initialize with $this->Charset, but it won't work well now.
     if (function_exists('mb_convert_encoding')) {
         //Using mb_string extension if exists.
         if ($this->needs_encode || $force) {
             $str_encoding = mb_detect_encoding($str, 'ASCII,' . $encode_charset);
             if ($str_encoding == 'ASCII') {
                 // Return original if string from only ASCII chars.
                 return $str;
             } else {
                 if ($str_encoding != $encode_charset) {
                     // Maybe this case may not occur.
                     $str = mb_convert_encoding($str, $encode_charset, $str_encoding);
                 }
             }
             //Following Logic are made for recovering PHP4.4.x mb_encode_mimeheader() bug.
             //TODO: If mb_encode_mimeheader() bug is fixed. Replace this to simple logic.
             $cut_start = 0;
             $encoded = '';
             $cut_length = floor((76 - strlen('Subject: =?' . $encode_charset . '?B?' . '?=')) / 4) * 3;
             while ($cut_start < strlen($str)) {
                 $partstr = mb_strcut($str, $cut_start, $cut_length, $encode_charset);
                 $partstr_length = strlen($partstr);
                 if (!$partstr_length) {
                     break;
                 }
                 if ($encode_charset == 'ISO-2022-JP') {
                     //Should Adjust next cutting place for SO & SI char insertion.
                     if (substr($partstr, 0, 3) === chr(27) . '$B' && substr($str, $cut_start, 3) !== chr(27) . '$B') {
                         $partstr_length -= 3;
                     }
                     if (substr($partstr, -3) === chr(27) . '(B' && substr($str, $cut_start + $partstr_length - 3, 3) !== chr(27) . '(B') {
                         $partstr_length -= 3;
                     }
                 }
                 if ($cut_start) {
                     $encoded .= "\r\n\t";
                 }
                 $encoded .= '=?' . $encode_charset . '?B?' . base64_encode($partstr) . '?=';
                 $cut_start += $partstr_length;
             }
         } else {
             $encoded = $str;
         }
     } else {
         $encoded = parent::encode_header($str, $position);
     }
     return $encoded;
 }