// 编码
function IMAPEncode($sStr)
{
$sOut = '';
$sBase64 = '';
$nIndex = 0;
$sRegAsis = '/^(?:[\x20-\x25\x27-\x7e])+/';
$sReg26 = '/^&/';
$sRegEncode = '/^(?:[^\x20-\x7e])+/';
$sRegEq = '/=+$/';
$sRegSlash = '/\//';
while ($nIndex < strlen($sStr))
{
$aTmp = array();
$nResult = preg_match($sRegAsis, $sStr, &$aTmp, null, $nIndex);
if ($nResult)
{
$nIndex += strlen($aTmp[0]);
$sOut .= $aTmp[0];
continue;
}
$nResult = preg_match($sReg26, $sStr, &$aTmp, null, $nIndex);
if ($nResult)
{
$nIndex += strlen($aTmp[0]);
$sOut .= '&-';
continue;
}
$nResult = preg_match($sRegEncode, $sStr, &$aTmp, null, $nIndex);
if ($nResult)
{
$nIndex += strlen($aTmp[0]);
$sBase64 = base64_encode(iconv('UTF-8', 'UTF-16BE', $aTmp[0]));
$sBase64 = preg_replace($sRegEq, '', $sBase64);
$sBase64 = preg_replace($sRegSlash, ',', $sBase64);
$sOut .= '&' . $sBase64 . '-';
continue;
}
}
return $sOut;
}
// 解码
function IMAPDeconde($sStr)
{
$sOut = '';
$sBase64 = '';
$nIndex = 0;
$sRegAsis = '/^([^&]+)/';
$sReg26 = '/^\&-/';
$sRegDecode = '/^\&([A-Za-z0-9+,]+)-?/';
$sRegComma = '/,/';
while ($nIndex < strlen($sStr))
{
$aTmp = array();
$nResult = preg_match($sRegAsis, $sStr, &$aTmp, null, $nIndex);
if ($nResult)
{
$nIndex += strlen($aTmp[0]);
$sOut .= $aTmp[0];
continue;
}
$nResult = preg_match($sReg26, $sStr, &$aTmp, null, $nIndex);
if ($nResult)
{
$nIndex += strlen($aTmp[0]);
$sOut .= '&';
continue;
}
$nResult = preg_match($sRegDecode, $sStr, &$aTmp, null, $nIndex);
if ($nResult)
{
$nIndex += strlen($aTmp[0]);
$sBase64 = substr($aTmp[0], 1, strlen($aTmp[0]) - 2);
$sBase64 = preg_replace($sRegComma, '/', $sBase64);
$nMod = strlen($sBase64) % 4;
if ($nMod > 0) $sBase64 .= str_repeat('=', 4 - $nMod);
$sBase64 = iconv('UTF-16BE', 'UTF-8', base64_decode($sBase64));
$sOut .= $sBase64;
continue;
}
}
return $sOut;
}