来自mySQL的数字变量在使用utf-8的php邮件中被截断

问题描述 投票:2回答:1

我尝试使用utf-8编码将数据库中的数值变量包含到邮件中。

这是php代码:

$req = $bdd->prepare('SELECT prix FROM offres WHERE rang=?');
$req->execute(array(1));
$donnees=$req->fetch();

$passage_ligne = "\n";

$v = 10.15;
$text='essai1 = '.$v;
$text.=$passage_ligne;
$text.= 'essai2 = '.$donnees['prix'];
$text.=' here is a french accent: é';
$v=$donnees['prix'];
$text.=$passage_ligne."essai3 = ".$v;

echo $text;

$from='[email protected]';
$replyto='[email protected]';
$Xmailer='PHP/';

$header = 'From: '. $from . $passage_ligne .'Reply-To: '. $replyto . $passage_ligne .'X-Mailer: '. $Xmailer . phpversion();
$header.= "MIME-Version: 1.0". $passage_ligne;
$header.= "Content-Type: text/plain; charset=utf-8". $passage_ligne;
$header.= "Content-Transfer-Encoding: quoted-printable". $passage_ligne;
$passage_ligne .'X-Mailer: '. $Xmailer . phpversion();

mail('[email protected]','sujet',$text,$header);

数字变量$ donnees ['prix'] = 18确实显示在屏幕上:

essai1 = 10.15 essai2 = 18 here is a french accent: é essai3 = 18

但不是在邮件中,它被截断为“8”:

essai1 = 10.15
essai2 =8 here is a french accent: é
essai3 =8

如果我使用以下标题:

$header = 'From: '. $from . $passage_ligne .'Reply-To: '. $replyto . $passage_ligne .'X-Mailer: '. $Xmailer . phpversion();

数字变量在邮件中正确显示,但不是重音符号:

essai1 = 10.15
essai2 = 18 here is a french accent: é
essai3 = 18

有没有办法同时在同一个邮件? - 谢谢

php email
1个回答
1
投票

=字符在quoted-printable编码中具有特殊含义。它被用作转义序列的前缀;它后跟2个十六进制数字来编码非打印字符。

在你的情况下,你发送= 18=之后的两个字符被视为十六进制代码1

如果要在带引号的可打印邮件中发送文字=,则需要将其编码为=3D

$v = 10.15;
$text='essai1 =3D '.$v;
$text.=$passage_ligne;
$text.= 'essai2 =3D '.$donnees['prix'];
$text.=' here is a french accent: é';
$v=$donnees['prix'];
$text.=$passage_ligne."essai3 =3D ".$v;

或者你可以使用quoted_printable_encode函数。

mail('[email protected]','sujet',quoted_printable_encode($text),$header);

后者可能是最好的解决方案,它也可以用重音字符解决你的问题。

© www.soinside.com 2019 - 2024. All rights reserved.