Cured_printable_encode est une fonction PHP couramment utilisée lorsqu'il traite du contenu de l'e-mail ou de certains formats de codage MIME. Il est utilisé pour coder des chaînes dans le format "cité imprimé" pour les rendre plus en toute sécurité, en particulier dans les environnements où une compatibilité ASCII 7 bits est nécessaire. Cependant, dans une utilisation réelle, de nombreux développeurs rencontreront un problème commun: il provoque une confusion dans le contenu codé, le format déroutant et même affectant l'analyse du contenu des e-mails.
Cet article résumera les raisons de la confusion des caractères de Newline dans le codage Cured_print_encode et les solutions pratiques pour aider les développeurs à utiliser cette fonction plus stable.
Après avoir utilisé le codage cité_printable_encode , certains développeurs peuvent rencontrer les problèmes suivants:
La position Newline dans la chaîne d'origine est modifiée;
Le signe excédent = apparaît avant la nouvelle ligne;
Lorsque certains clients de messagerie résolvent, les ruptures de ligne ou le contenu sont mal alignées;
Les lignes longues sont automatiquement insérées = \ r \ n pour l'enveloppement de lignes souples, détruisant la structure du contenu.
La plupart de ces problèmes découlent des règles de codage et du comportement par défaut dans la fonction Cured_printable_encode .
Cured_printable_encode suit les spécifications de codage dans la norme RFC 2045, et ses caractéristiques clés comprennent:
La longueur maximale de chaque ligne est de 76 caractères et les ruptures de ligne souple seront automatiquement insérées si elles les dépassent ( = \ r \ n );
Les caractères non ASCII ou les caractères spéciaux seront convertis en forme = xx ;
Lorsque vous traitez des ruptures de ligne, si la chaîne d'origine utilise \ n ou \ r au lieu de la norme \ r \ n , des ruptures de ligne inattendues peuvent se produire après le codage.
Par conséquent, il est très important de standardiser la nouvelle ligne à \ r \ n avant le codage .
Voici quelques conseils et conseils pratiques pour éviter la confusion de rupture de ligne:
Avant le codage, tous les caractères de la nouvelle ligne sont uniformément traités comme \ r \ n :
<span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">normalize_line_endings</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$string</span></span></span><span>) {
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-title function_ invoke__">preg_replace</span></span><span>(</span><span><span class="hljs-string">'/\r\n|\r|\n/'</span></span><span>, </span><span><span class="hljs-string">"\r\n"</span></span><span>, </span><span><span class="hljs-variable">$string</span></span><span>);
}
</span><span><span class="hljs-variable">$original</span></span><span> = </span><span><span class="hljs-string">"C'est la première ligne\nC'est la deuxième ligne\r\nC'est la troisième ligne\rC'est la quatrième ligne"</span></span><span>;
</span><span><span class="hljs-variable">$normalized</span></span><span> = </span><span><span class="hljs-title function_ invoke__">normalize_line_endings</span></span><span>(</span><span><span class="hljs-variable">$original</span></span><span>);
</span><span><span class="hljs-variable">$encoded</span></span><span> = </span><span><span class="hljs-title function_ invoke__">quoted_printable_encode</span></span><span>(</span><span><span class="hljs-variable">$normalized</span></span><span>);
</span></span>
Cela garantit que le format de rupture de ligne est cohérent et évite les pauses inutiles après le codage.
Étant donné que la longueur maximale de chaque ligne est de 76 caractères, si le texte d'origine est trop long, les ruptures de ligne souple seront automatiquement ajoutées. Ce n'est peut-être pas le comportement que nous attendons dans certains scénarios.
Une façon consiste à segmenter manuellement le contenu ou à traiter les ruptures de ligne souple après le codage:
<span><span><span class="hljs-variable">$encoded</span></span><span> = </span><span><span class="hljs-title function_ invoke__">quoted_printable_encode</span></span><span>(</span><span><span class="hljs-variable">$normalized</span></span><span>);
</span><span><span class="hljs-comment">// Remplacer les pauses de ligne souple,Fusionner en une seule ligne(Dépend de la scène)</span></span><span>
</span><span><span class="hljs-variable">$cleaned</span></span><span> = </span><span><span class="hljs-title function_ invoke__">str_replace</span></span><span>(</span><span><span class="hljs-string">"=\r\n"</span></span><span>, </span><span><span class="hljs-string">''</span></span><span>, </span><span><span class="hljs-variable">$encoded</span></span><span>);
</span></span>
Remarque: Cette approche convient aux scénarios qui ne s'appuient pas sur les pauses de lignes, telles que le transfert de texte intégré, mais ne conviennent pas au corps de courrier codé en mime .
Si vous utilisez cité_print_encode pour le contenu HTML complet lors du traitement des messages HTML, il est facile de provoquer la séparation de la balise ou de la structure. Il est recommandé de coder uniquement des pièces de texte brut ou d'utiliser une bibliothèque de courrier professionnelle telle que phpmailer à gérer:
<span><span><span class="hljs-keyword">use</span></span><span> </span><span><span class="hljs-title">PHPMailer</span></span><span>\</span><span><span class="hljs-title">PHPMailer</span></span><span>\</span><span><span class="hljs-title">PHPMailer</span></span><span>;
</span><span><span class="hljs-variable">$mail</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title class_">PHPMailer</span></span><span>();
</span><span><span class="hljs-variable">$mail</span></span><span>-></span><span><span class="hljs-title function_ invoke__">isSMTP</span></span><span>();
</span><span><span class="hljs-comment">// ...</span></span><span>
</span><span><span class="hljs-variable">$mail</span></span><span>->CharSet = </span><span><span class="hljs-string">'UTF-8'</span></span><span>;
</span><span><span class="hljs-variable">$mail</span></span><span>->Encoding = </span><span><span class="hljs-string">'quoted-printable'</span></span><span>; </span><span><span class="hljs-comment">// Traiter automatiquement l'encodage</span></span><span>
</span></span>
La fonction IMAP_8BIT de PHP peut également générer un format imprimé cité et, dans certains cas, est plus stable que cité_printable_encode :
<span><span><span class="hljs-variable">$encoded</span></span><span> = </span><span><span class="hljs-title function_ invoke__">imap_8bit</span></span><span>(</span><span><span class="hljs-variable">$normalized</span></span><span>);
</span></span>
Cependant, cette fonction dépend de l'extension IMAP , et il est nécessaire de confirmer si l'environnement du serveur le prend en charge.
Cured_printable_encode est largement utilisé dans le traitement des e-mails et le codage des données, mais le comportement par défaut peut provoquer une confusion dans les ruptures de ligne et autres problèmes. Les points suivants peuvent éviter efficacement les problèmes lors de l'encodage:
Le caractère de rupture de ligne unifiée avant le codage est \ r \ n ;
Faites attention au mécanisme d'insertion des ruptures de lignes souples;
Décidez de nettoyer manuellement selon la scène = \ r \ n ;
Veillez à coder le contenu HTML;
Envisagez d'utiliser une bibliothèque de messagerie mature ou des fonctions alternatives.
Après avoir maîtrisé les compétences ci-dessus, vous pouvez être plus pratique lorsque vous utilisez Cured_printable_encode , et le contenu de codage est plus stable et fiable.