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
(PHP 4, PHP 5, PHP 7)
imap_utf8 — Converts MIME-encoded text to UTF-8
$mime_encoded_text
)
Converts the given mime_encoded_text
to
UTF-8.
Returns an UTF-8 encoded string.
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
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
That fixed the all caps issue:
<?php
function imap_utf8_fix($string) {
return iconv_mime_decode($string,0,"UTF-8");
}
?>
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.
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. :)
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 :-)
# 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.
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;
}
?>