function _sub_quoted_printable_encode($str, $encoding, $maxline, $linefeed) { global $mbemu_internals; switch ($e = $mbemu_internals['encoding'][$encoding]) { case 0: //ascii //ascii case 1: //euc-jp //euc-jp case 2: //shift-jis //shift-jis case 4: //utf-8 $max = preg_match_all('/' . $mbemu_internals['regex'][$e] . '/', $str, $allchars); break; case 3: //jis $max = preg_match_all('/' . $mbemu_internals['regex'][3] . '/', $str, $allchunks, PREG_SET_ORDER); // �����킲�Ƃ̔z��ɕ��� $st = ''; // quoted printable�ϊ���̕����� $len = $maxline; // ���̍s�ɒlj��\�ȃo�C�g�� $needterminate = FALSE; //�Ō�ɃG�X�P�[�v�V�[�P���X���K�v���ǂ��� for ($i = 0; $i < $max; ++$i) { if (ord($allchunks[$i][1])) { //�p���Ƀ}�b�` if ($needterminate) { $st .= '=1B=28B'; $len -= 7; } $tmparr = unpack("C*", $allchunks[$i][1]); foreach ($tmparr as $char) { $tmp = _sub_qponechar(chr($char), $l); if ($len < $l) { $st .= $linefeed; $len = $maxline; } $st .= $tmp; $len -= $l; } $needterminate = FALSE; } elseif (ord($allchunks[$i][2])) { //�����Ƀ}�b�` $maxchars = preg_match_all("/../", substr($allchunks[$i][0], 3), $allchars); $tmp = _sub_qponechar($allchars[0][0], $l); if ($len < 14 + $l) { if ($needterminate) { $st .= '=1B=28B'; } $st .= $linefeed; $len = $maxline; } $st .= '=1B=24B'; $len -= 7; for ($j = 0; $j < $maxchars; ++$j) { $tmp = _sub_qponechar($allchars[0][$j], $l); if ($len < $l + 7) { $st .= '=1B=28B' . $linefeed . '=1B=24B'; $len = $maxline - 7; } $st .= $tmp; $len -= $l; } $needterminate = TRUE; } elseif (ord($allchunks[$i][3])) { //���p�J�i�Ƀ}�b�` $max = preg_match_all("/./", $allchunks[$i][3], $allchars); $tmp = _sub_qponechar($allchars[0][0], $l); if ($len < 14 + $l) { if ($needterminate) { $st .= '=1B=28B'; } $st .= $linefeed; $len = $maxline; } $st .= '=1B=28I'; $len -= 7; for ($j == 0; $j < $max; ++$j) { $tmp = _sub_qponechar($allchars[0][$j], $l); if ($len < $l + 7) { $st .= '=1B=28B' . $linefeed . '=1B=28I'; $len = $maxline - 7; } $st .= $tmp; $len -= $l; } $needterminate = TRUE; } } if ($needterminate) { $st .= '=1B=28B'; } $st .= $linefeed; return $st; } $st = ''; // quoted printable�ϊ���̕����� $len = $maxline; // ���̍s�ɒlj��\�ȃo�C�g�� for ($i = 0; $i < $max; ++$i) { $tmp = _sub_qponechar($allchars[0][$i], $l); if ($l > $len) { $st .= $linefeed; $len = $maxline; } $st .= $tmp; $len -= $l; } $st .= $linefeed; return $st; }
function _sub_quoted_printable_encode($str, $encoding, $maxline, $linefeed) { global $_mb_encoding, $euc_match, $utf8_match, $sjis_match; switch ($_mb_encoding[$encoding]) { case 0: //ascii $allchars[0] = unpack("c*", $str); $max = count($allchars[0]); break; case 1: //euc-jp $max = preg_match_all("/{$euc_match}/", $str, $allchars); break; case 2: //shift-jis $max = preg_match_all("/{$sjis_match}/", $str, $allchars); break; case 4: //utf-8 $max = preg_match_all("/{$utf8_match}/", $str, $allchars); break; case 3: //jis $jis_match = "(?:^|\\(B)([^]*)|{$B}([^]*)|\\(I([^]*)"; $max = preg_match_all("/{$jis_match}/", $str, $allchunks, PREG_SET_ORDER); // 文字種ごとの配列に分解 $st = ''; // quoted printable変換後の文字列 $len = $maxline; // その行に追加可能なバイト数 $needterminate = FALSE; //最後にエスケープシーケンスが必要かどうか for ($i = 0; $i < $max; ++$i) { if (ord($allchunks[$i][1])) { //英数にマッチ if ($needterminate) { $st .= '=1B=28B'; $len -= 7; } $tmparr = unpack("C*", $allchunks[$i][1]); foreach ($tmparr as $char) { $tmp = _sub_qponechar(chr($char), $l); if ($len < $l) { $st .= $linefeed; $len = $maxline; } $st .= $tmp; $len -= $l; } $needterminate = FALSE; } elseif (ord($allchunks[$i][2])) { //漢字にマッチ $maxchars = preg_match_all("/../", substr($allchunks[$i][0], 3), $allchars); $tmp = _sub_qponechar($allchars[0][0], $l); if ($len < 14 + $l) { if ($needterminate) { $st .= '=1B=28B'; } $st .= $linefeed; $len = $maxline; } $st .= '=1B=24B'; $len -= 7; for ($j = 0; $j < $maxchars; ++$j) { $tmp = _sub_qponechar($allchars[0][$j], $l); if ($len < $l + 7) { $st .= '=1B=28B' . $linefeed . '=1B=24B'; $len = $maxline - 7; } $st .= $tmp; $len -= $l; } $needterminate = TRUE; } elseif (ord($allchunks[$i][3])) { //半角カナにマッチ $max = preg_match_all("/./", $allchunks[$i][3], $allchars); $tmp = _sub_qponechar($allchars[0][0], $l); if ($len < 14 + $l) { if ($needterminate) { $st .= '=1B=28B'; } $st .= $linefeed; $len = $maxline; } $st .= '=1B=28I'; $len -= 7; for ($j == 0; $j < $max; ++$j) { $tmp = _sub_qponechar($allchars[0][$j], $l); if ($len < $l + 7) { $st .= '=1B=28B' . $linefeed . '=1B=28I'; $len = $maxline - 7; } $st .= $tmp; $len -= $l; } $needterminate = TRUE; } } if ($needterminate) { $st .= '=1B=28B'; } $st .= $linefeed; return $st; } $st = ''; // quoted printable変換後の文字列 $len = $maxline; // その行に追加可能なバイト数 for ($i = 0; $i < $max; ++$i) { $tmp = _sub_qponechar($allchars[0][$i], $l); if ($l > $len) { $st .= $linefeed; $len = $maxline; } $st .= $tmp; $len -= $l; } $st .= $linefeed; return $st; }