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.
参见
imap_mime_header_decode()
Decode MIME header elements
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. :)