downloads | documentation | faq | getting help | mailing lists | licenses | wiki | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

mb_encode_numericentity> <mb_detect_order
Last updated: Fri, 14 Aug 2009

view this page in

mb_encode_mimeheader

(PHP 4 >= 4.0.6, PHP 5)

mb_encode_mimeheaderEncode une chaîne pour un en-tête MIM

Description

string mb_encode_mimeheader ( string $str [, string $charset [, string $transfer_encoding [, string $linefeed [, int $indent ]]]] )

Encode la chaîne str en un en-tête MIME.

Liste de paramètres

str

La chaîne à encoder.

charset

charset est le nom de l'encodage utilisé par la chaîne str . La valeur par défaut est déterminée par les paramètres courants du NLS (mbstring.language). mb_internal_encoding() doit être le même encodage.

transfer_encoding

transfer_encoding est l'encodage de transfert. Il peut être "B" (Base64) ou "Q" (Quoted-Printable). Par défaut, c'est "B".

linefeed

linefeed spécifie les fins de lignes (EOF : end-of-line) utilisées par mb_encode_mimeheader() pour formater la chaîne (une » RFC définie la longueur d'une chaîne à partir de laquelle on doit ajouter une fin de ligne. La longueur courante est 74 caractères). La valeur par défaut est "\r\n" (CRLF).

indent

Indentation de la première ligne (nombre de caractères dans l'en-tête avant la chaîne str ).

Valeurs de retour

Une version convertie de la chaîne en ASCII.

Historique

Version Description
5.0.0 Le paramètre indent a été ajouté.

Exemples

Exemple #1 Exemple avec mb_encode_mimeheader()

<?php
$name 
""// kanji
$mbox "kru";
$doma "gtinn.mon";
$addr mb_encode_mimeheader($name"UTF-7""Q") . " <" $mbox "@" $doma ">";
echo 
$addr;
?>

Notes

Note: Cette fonction n'est pas faite pour couper les lignes en milieu de mots. Ce comportement peut ajouter des espaces non désirées dans un mot de la chaîne originale.

Voir aussi



mb_encode_numericentity> <mb_detect_order
Last updated: Fri, 14 Aug 2009
 
add a note add a note User Contributed Notes
mb_encode_mimeheader
Anonymous
12-Apr-2009 01:19
I could not find a PHP function to MIME encode the name for a n email address.

Input   = "Karl Müller<kmueller@gmx.de>"
Output = "Karl%20M%FCller<kmueller@gmx.de>"

I wrote it on my own:

<?php
// required to encode names in email addresses   
// replace " " with "%20"
// replace "ü" with "%FC"
// replace "%" with "%25"      etc....
// Use "%" as Delimiter for MIME
// Use "=" as Delimiter for Quoted Printable
// Input string must be UTF8 encoded
public static function EncodeMime($Text, $Delimiter)
{
   
$Text = utf8_decode($Text);
   
$Len  = strlen($Text);
   
$Out  = "";
    for (
$i=0; $i<$Len; $i++)
    {
       
$Chr = substr($Text, $i, 1);
       
$Asc = ord($Chr);

        if (
$Asc > 0x255) // Unicode not allowed
       
{
           
$Out .= "?";
        }
        else if (
$Chr == " " || $Chr == $Delimiter || $Asc > 127)
        {
           
$Out .= $Delimiter . strtoupper(bin2hex($Chr));
        }
        else
$Out .= $Chr;
    }
    return
$Out;
}
?>
tokul at users dot sourceforge dot net
30-Mar-2008 12:26
mb_encode_mimeheader() depends on correct mbstring.internal_encoding setting. It tries to convert $str from internal encoding to $charset. If you ignore mbstring internal encoding, function might encode strings incorrectly even when $str character set matches $charset
chappy at citromail dot hu
05-Jun-2006 11:33
I found a bad function.

<?php
function encodeHeader($input, $charset = 'ISO-8859-2')
{
   
preg_match_all('/(\\w*[\\x80-\\xFF]+\\w*)/', $input, $matches);
    foreach (
$matches[1] as $value) {
       
$replacement = preg_replace('/([\\x80-\\xFF])/e', '"=" . strtoupper(dechex(ord("\\1")))', $value);
       
$input = str_replace($value, '=?' . $charset . '?Q?' . $replacement . '?=', $input);
    }
    return
$input;
}
?>

This function should be used:

<?php
function encodeHeader($input, $charset = 'ISO-8859-2')
{
   
$m=preg_match_all('/(\w*[\x80-\xFF]+\w*)/', $input, $matches);
    if(
$m)$input=mb_encode_mimeheader($input,$charset, 'Q');
    return
$input;
}
?>
stormflyCUT at hyh dot pl
05-May-2006 11:41
Some solution for using national chars and have problem with UTF-8 for example in mail subject. Before you use mb_encode_mimeheader with UTF-8 set mb_internal_encoding('UTF-8').
paravoid
02-Jan-2006 01:58
If mb_ version doesn't work for you in MIME-B mode:

function encode_mimeheader($string, $charset=null, $linefeed="\r\n") {
    if (!$charset)
        $charset = mb_internal_encoding();

    $start = "=?$charset?B?";
    $end = "?=";
    $encoded = '';

    /* Each line must have length <= 75, including $start and $end */
    $length = 75 - strlen($start) - strlen($end);
    /* Average multi-byte ratio */
    $ratio = mb_strlen($string, $charset) / strlen($string);
    /* Base64 has a 4:3 ratio */
    $magic = $avglength = floor(3 * $length * $ratio / 4);

    for ($i=0; $i <= mb_strlen($string, $charset); $i+=$magic) {
        $magic = $avglength;
        $offset = 0;
        /* Recalculate magic for each line to be 100% sure */
        do {
            $magic -= $offset;
            $chunk = mb_substr($string, $i, $magic, $charset);
            $chunk = base64_encode($chunk);
            $offset++;
        } while (strlen($chunk) > $length);
        if ($chunk)
            $encoded .= ' '.$start.$chunk.$end.$linefeed;
    }
    /* Chomp the first space and the last linefeed */
    $encoded = substr($encoded, 1, -strlen($linefeed));

    return $encoded;
}
nigrez at nius dot waw dot pl
13-Dec-2005 11:42
True, function is broken (PHP5.1, encoding from UTF-8 with pl_PL charset). Below is about 15% faster version of proposed _mb_mime_encode. Also it has header more like othe mb_* functions and doesn't trigger any errors/warnings/notices.

<?php

function mb_mime_header($string, $encoding=null, $linefeed="\r\n") {
  if(!
$encoding) $encoding = mb_internal_encoding();
 
$encoded = '';

  while(
$length = mb_strlen($string)) {
   
$encoded .= "=?$encoding?B?"
            
. base64_encode(mb_substr($string,0,24,$encoding))
             .
"?=$linefeed";

   
$string = mb_substr($string,24,$length,$encoding);
  }

  return
$encoded;
}

?>
gullevek at gullevek dot org
07-Nov-2005 01:29
My first post was around 2003, and still the mb_mime_header is broken. It is *NOT* usable with longer subjects, and mostly unusable with anything else than japanese.

iwakura at junx dot org is also not working for me, it produces also some gargabe.

I updated my old function (the one I posted 2003) and I tested it with overlong subjects in UTF-8, ISO-2022-JP (japanese), GB2312 (simplified chinese) and EUC-KR (korean) and I got readable results in thunderbird, mail.app, outlook, etc.

<?php

function _mb_mime_encode($string, $encoding)
{
   
$pos = 0;
   
// after 36 single bytes characters if then comes MB, it is broken
    // but I trimmed it down to 24, to stay 100% < 76 chars per line
   
$split = 24;
    while (
$pos < mb_strlen($string, $encoding))
    {
       
$output = mb_strimwidth($string, $pos, $split, "", $encoding);
       
$pos += mb_strlen($output, $encoding);
       
$_string_encoded = "=?".$encoding."?B?".base64_encode($output)."?=";
        if (
$_string)
           
$_string .= "\r\n";
       
$_string .= $_string_encoded;
    }
   
$string = $_string;
    return
$string;
}

?>
chappy at citromail dot hu
29-Oct-2005 06:14
In countries where there's non-us ASCII, it's a very good example, for sending mail:

mb_internal_encoding('iso-8859-2');
setlocale(LC_CTYPE, 'hu_HU');

function encode($str,$charset){
    $str=mb_encode_mimeheader(trim($str),$charset, 'Q', "\n\t");
    return $str;
}

print encode('the text with spec. chars: &#337; &#368; &#336; &#369;, á','iso-8859-2');

It creates a 7bit string
iwakura at junx dot org
16-Sep-2005 06:35
i think mb_encode_mimeheader still have bug. here is sample code:

function mb_encode_mimeheader2($string, $encoding = "ISO-2022-JP") {
    $string_array = array();
    $pos = 0;
    $row = 0;
    $mode = 0;
   
    while ($pos < mb_strlen($string)) {
        $word = mb_strimwidth($string, $pos, 1);
        if (!$word) {
            $word = mb_strimwidth($string, $pos, 2);
        }
        if (mb_ereg_match("[ -~]", $word)) {    // ascii
            if ($mode != 1) {
                $row++;
                $mode = 1;
                $string_array[$row] = NULL;
            }
        } else {                                // multibyte
            if ($mode != 2) {
                $row++;
                $mode = 2;
                $string_array[$row] = NULL;
            }
        }
        $string_array[$row] .= $word;
        $pos++;
    }
   
    //echo "<pre>";
    //print_r($string_array);
    //echo "</pre>";
   
    foreach ($string_array as $key => $value) {
        $value = mb_convert_encoding($value, $encoding);
        $string_array[$key] = mb_encode_mimeheader($value, $encoding);
    }
   
    //echo "<pre>";
    //print_r($string_array);
    //echo "</pre>";
   
    return implode("", $string_array);
}

is not the best, but it works
mortoray at ecircle-ag dot com
15-Mar-2005 09:19
At least for Q encoding, this function is unsafe and does not encode correctly. Raw characters which appear as RFC2047 sequences are simply left as is.

Ex:

mb_encode_mimeheader( '=?iso-8859-1?q?this=20is=20some=20text?=' );

returns '=?iso-8859-1?q?this=20is=20some=20text?='

The exact same string, which is obviously not the encoding for the source string.  That is, mb_encode_mimeheader does not do any type of escaping.

That is, the following condition is not always true:
    mb_decode_mimeheader( mb_encode_mimeheader( $text ) ) == $text
gullevek at gullevek dot org
30-Jul-2003 07:02
Read this FIRST: http://bugs.php.net/bug.php?id=23192 because mb_encode_mimeheaders is BUGGY!

a work around for the multibyte broken error for too long subjects for ISO-2022-JP:

$pos=0;
$split=36; // after 36 single bytes characters, if then comes MB, it is broken
while ($pos<mb_strlen($string,$encoding))
{
  $output=mb_strimwidth($string,$pos,$split,"",$encoding);
  $pos+=mb_strlen($output,$encoding);
  $_string.=(($_string)?' ':'').mb_encode_mimeheader($output,$encoding);
}
$string=$_string;

is not the best, but it works
masataka
12-Apr-2003 02:46
second parameter 'charset' is character encoding name, but default must be UTF-8 on PHP4.3.1.

mb_encode_numericentity> <mb_detect_order
Last updated: Fri, 14 Aug 2009
 
 
show source | credits | stats | sitemap | contact | advertising | mirror sites