[copie et suivi vers fr.comp.lang.php]
Bonjour,
Le 17/10/2020 22:14, yamo' me répondait :
>
>> Est-ce que ça servirait à quelque chose que je code moi-même une fonction
>> en PHP pour [coder les entêtes en MIME) ? Je n'en ai plus fait depuis PHP 4
>> mais je peux m'y remettre.
>
> C'est comme tu veux. Ce serait avec plaisir que je l'incorporerais.
> Le code est sur git et l'installation est simplissime.
>
> Il y a juste groups.txt et config.inc.php à éditer (de mémoire, je suis
> sur un smartphone). Créer le répertoire spool et changer les droits pour
> que le user utilisé par le serveur http puisse écrire et créer des
> fichiers dans spool.
>
>
https://gitlab.com/yamo-nntp/newsportal
Je pense avoir trouvé où ça se trouve : dans lib/post.inc.php :
==========================================================================
function message_post($subject,$from,$newsgroups,$ref,$body) {
global $server,$port,$send_poster_host,$organization,$text_error;
global $file_footer,$www_charset,$spooldir;
global $msgid_generate,$msgid_fqdn;
flush();
$ns=nntp_open($server,$port);
if ($ns != false) {
fputs($ns,"POST\r\n");
$weg=line_read($ns);
$subject = str_replace("\n","",$subject);
$subject = str_replace("\r","",$subject);
$subject = str_replace("\t"," ",$subject);
$subject = utf8_encode($subject);
fputs($ns,"User-Agent: " . mb_encode_mimeheader("NewsPortal/0.50.1b") .
"\r\n");
fputs($ns,'From: '. $from ."\r\n"); //$from est déjà encodé dans post.php
fputs($ns,'Newsgroups: '.$newsgroups."\r\n");
fputs($ns,"Mime-Version: 1.0\r\n");
fputs($ns,"Content-Type: text/plain; charset=".$www_charset.";
format=flowed\r\n");
fputs($ns,"Content-Transfer-Encoding: 8bit\r\n");
$subject= iconv ( "UTF-8", "ISO-8859-15" ,$subject );
$subject_mime=mb_encode_mimeheader( $subject,"UTF-8", "Q");
fputs($ns,'Subject: '. $subject_mime . "\r\n");
==========================================================================
Tout d'abord, je suis particulièrement surpris par :
==========================================================================
$subject= iconv ( "UTF-8", "ISO-8859-15" ,$subject );
$subject_mime=mb_encode_mimeheader( $subject,"UTF-8", "Q");
==========================================================================
Mais en fait aussi par ça qui précède :
==========================================================================
$subject = utf8_encode($subject);
==========================================================================
Si je comprends bien ce code, le paramètre $subject est supposé être
en ISO-8859-1, traduit en UTF-8 par utf8_encode(), puis traduit d'UTF-8
en ISO-8859-15 par iconv(), et enfin retraduit en UTF-8 depuis l'encodage
de mb_internal_encoding() que je suppose être ISO-8859-15.
Le résultat de tous ces transcodages, c'est que seuls les caractères qui
appartiennent à la fois à ISO-8859-1 et à ISO-8859-15 ont une chance d'en
ressortir indemne... donc par exemple pas € (dans ISO-8859-15 uniquement)
ni ½ (dans ISO-8859-1 uniquement) et encore moins √ (dans aucune des deux).
--
Olivier Miakinen