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; }