©
This document uses PHP Chinese website manual Release
(PHP 5, PHP 7)
iconv_mime_decode — Decodes a MIME header field
$encoded_header
[, int $mode
= 0
[, string $charset
= ini_get("iconv.internal_encoding")
]] )Decodes a MIME header field.
encoded_header
The encoded header, as a string.
mode
mode
determines the behaviour in the event
iconv_mime_decode() encounters a malformed
MIME header field. You can specify any combination
of the following bitmasks.
Value | Constant | Description |
---|---|---|
1 | ICONV_MIME_DECODE_STRICT | If set, the given header is decoded in full conformance with the standards defined in » RFC2047. This option is disabled by default because there are a lot of broken mail user agents that don't follow the specification and don't produce correct MIME headers. |
2 | ICONV_MIME_DECODE_CONTINUE_ON_ERROR | If set, iconv_mime_decode_headers() attempts to ignore any grammatical errors and continue to process a given header. |
charset
The optional charset
parameter specifies the
character set to represent the result by. If omitted,
iconv.internal_encoding
will be used.
Returns a decoded MIME field on success,
or FALSE
if an error occurs during the decoding.
Example #1 iconv_mime_decode() example
<?php
// This yields "Subject: Prüfung Prüfung"
echo iconv_mime_decode ( "Subject: =?UTF-8?B?UHLDvGZ1bmcgUHLDvGZ1bmc=?=" ,
0 , "ISO-8859-1" );
?>
[#1] Dirk Becker [2013-07-26 09:46:57]
While creating a new webmailer, I had to coop with a lot of mails and only half of them were correct encoded!
Often the text is tagged as ISO but in real its UTF :/
After trying a lot of solutions and combination a found a way which seems to work for all our mails. Maybe its usefull to someone else too.
<?php
function mime_encode($data)
{
$resp = imap_utf8(trim($data));
if(preg_match("/=\?/", $resp))
$resp = iconv_mime_decode($data, ICONV_MIME_DECODE_CONTINUE_ON_ERROR, "ISO-8859-15");
if(json_encode($resp) == 'null')
$resp = utf8_encode($resp);
return $resp;
}
?>
[#2] koronci at aol dot com [2012-12-19 11:24:52]
A simple and working solution for latin encoding supports Slovak, Czech, Russian ect.
<?php iconv("utf-8", "windows-1250", $SomeWeirdText); ?>
specially for those who strugle with imap_mime_header_decode
[#3] dido dot sevilla at gmail dot com [2005-03-09 08:00:14]
In PHP versions that have imap_mime_decode built in, it's possible to emulate the operation of this function:
<?php
function iconv_mime_decode($str, $mode=0, $charset="UTF-8")
{
$data = imap_mime_header_decode($str);
if (count($data) > 0) {
// because iconv doesn't like the 'default' for charset
$charset = ($data[0]->charset == 'default') ? 'ASCII' : $data[0]->charset;
return(iconv($charset, $charset, $data[0]->text));
}
return("");
}
?>
I've only tried to use this code snippet to decode ISO-2022-JP messages to UTF-8, but I see no reason why it shouldn't work in other cases.