• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • imap_utf8()

    (PHP 4, PHP 5, PHP 7)

    Converts MIME-encoded text to UTF-8

    说明

    imap_utf8 (string $mime_encoded_text) : string

    Converts the given$mime_encoded_textto UTF-8.

    参数

    $mime_encoded_text

    A MIME encoded string. MIME encoding method and the UTF-8 specification are described in » RFC2047 and » RFC2044 respectively.

    返回值

    Returns an UTF-8 encoded string.

    参见

    That fixed the all caps issue:
    <?php
    function imap_utf8_fix($string) {
     return iconv_mime_decode($string,0,"UTF-8");
    }
    ?>
    
    Use iconv_mime_decode();
    <?php
    // This yields "Subject: Prüfung Prüfung"
    echo iconv_mime_decode("Subject: =?UTF-8?B?UHLDvGZ1bmcgUHLDvGZ1bmc=?=",
                0, "ISO-8859-1");
    ?>
    http://php.net/manual/de/function.iconv-mime-decode.php
    # this script are correct with the right signs remove expression
    # please, ignore the later.
    function decode_utf8($str){
        # paterns
          $err="(=\?.{10,13}q\?_?|\?\=)";
          $pat = "/=([0-9A-F]{2})/"; 
          $cha="'.chr(hexdec(";
        # erase null signs in string
         $str=eregi_replace($err,"",$str);
        # to decode with eval and replace
         eval("\$str='".
             preg_replace($pat,$cha."'$1')).'",$str)
             ."';");
        # return
          return $str;
    } 
    #Note: you can to reduce this script in 3 lines.
    You may also try this example:
    $_subject = "=?iso-8859-1?b?THV6b26uMTQ=?= dot CoM";
    echo utf8_decode(imap_utf8($_subject));
    OUTPUT: Luzon®14 dot CoM
    Regards,
    Tuso/Nazareth
    string in uppercase error http://bugs.php.net/bug.php?id=44098
    my function to decode string
    <?php
    function decodeMimeStr($string, $charset="UTF-8" )
    {
       $newString = '';
       $elements=imap_mime_header_decode($string);
       for($i=0;$i<count($elements);$i++) 
       {
        if ($elements[$i]->charset == 'default')
         $elements[$i]->charset = 'iso-8859-1';
        $newString .= iconv($elements[$i]->charset, $charset, $elements[$i]->text);
       }
       return $newString;
    }
    ?>
    
    Be aware: imap_utf8 tends to return the string in uppercase.
    Also see: 
    <?php
    imap_mime_header_decode($sting);
    ?>
    Don't try to decode subjects with this one... imap_mime_header_decode does a much better job at that.
    To get a complete decode to utf8 (which is the protocol with "national" characters), use these two:
    $subject = "=?ISO-8859-1?Q?B=F8lla?=, med =?ISO-8859-1?Q?=F8l?= i baggen";
    $subject = imap_utf8($subject);
    $subject = utf8_decode($subject);
    will return the subject in 8-bit ascii.
    That is, both functions.
    knutm :-)
    I got issues decoding strings with spanish characters. I found encodeISO88591() function at this manual as an user note. 
    After having problems with imap_utf8() and utf8_decode(), I've decided create a function decodeISO88591() for decoding strings encoded with encodeISO88591().
    Here's the code(I've translated remarks and variable and array names from spanish to english for better understanding):
    function encodeISO88591($string)
    {
     // ISO-8859-1 string header
     $stringISO = "=?iso-8859-1?q?";
     
     // Each character are encoded('equal-to' symbol + hexadecimal value from ASCII code)
     for($i=0;$i<strlen($string);$i++)
     {
      // Basic ASCII characters are not encoded
      if(ord(substr($string,$i,1))<1 || ord(substr($string,$i,1))>127)
      {
       $char = ord($string[$i]);
       $char = strtoupper(dechex($char));
       $stringISO.="=".$char;
      }
      else
      {
       $stringISO.=substr($string,$i,1);
      }
     }
     
     // ISO-8859-1 string footer
     $stringISO.="?= ";
     
     return($stringISO);
    }
    // And this is my function decodeISO88591()
    function decodeISO88591($string)
    { 
     // Arrays for obtaining hexadecimal values 
     // for each ISO-8859-1 charset
     $mAlfa=array("A","B","C","D","E","F");
     $mNum=array();
     for($n=0;$n<10;$n++)
     {
      $mNum[]=$n;
     }
     
     // ISO-8859-1 charset
     $iso88591=array(" ","","","","",
                 "","","","","","",
                 "","","","","","",
                 "","","","","","",
                 "","","","","","",
                 "","","","","","",
                 "","","","","","",
                 "","","","","","","",
                 "","","","","","",
                 "","","","","","",
                 "","","","","","","",
                 "","","","","","","",
                 "","","","","","","","",
                 "","","","","","","",
                 "","","","","","","");
     // Hexadecimal values array
     for($a=0;$a<sizeof($mAlfa);$a++)
     {
      for($n=0;$n<sizeof($mNum);$n++)
      {
       $mHex[]=$mAlfa[$a].$mNum[$n];
      }
      for($a2=0;$a2<sizeof($mAlfa);$a2++)
      {
       $mHex[]=$mAlfa[$a].$mAlfa[$a2];
      }
     }
     
     // ISO-8859-1 string header and footer are deleted
     $string=str_replace("=?iso-8859-1?q?","",$string);
     $string=str_replace("?= ","",$string);
     
     // Encoded values are decoded
     for($h=0;$h<sizeof($mHex);$h++)
     {
      $string=str_replace(("=".$mHex[$h]),$iso88591[$h],$string);
     }
     
     return($string);
    }
    I hope this helps somebody. :)