htmlentities comportement inattendu

Kran
Invité n'ayant pas de compte PHPfrance

06 oct. 2009, 11:54

Messieurs-Dammes Bonjour,

Je rencontre actuellement un comportement étrange (et plutot gènant!) de la fonction htmlentities : elle semble utiliser la même table de translation que html_special_chars... :shock:

En clair, les deux fonctions suivantes me rentourent la même, chose c'est à dire $montexte dont les caractères <, > et 2 ou 3 autres trucs ont étés remplacés...
  • htmlentities( $montexte , ENT_QUOTES , 'UTF-8' )
    html_special_chars( $montexte , ENT_QUOTES , 'UTF-8' )
Alors que quand j'appel la fonction strtr en précisant bien la table de translation à utiliser, j'ai bien les résultats attendus dans chacun des cas...
  • strtr( $montexte , get_html_translation_table(HTML_ENTITIES) )
    strtr( $montexte , get_html_translation_table(HTML_SPECIAL_CHARS) )


J'ai pourtant sur le même serveur une autre appli php qui utilise massivement la fonction htmlentities... et tout fonctionne à merveille !

Auriez-vous par hasard connaissance de cas ou ceci pourrait se produire ? Ou des pistes de réflexion peut-être ? Car là, j'avoue patauger un tantinet...

Cordialement,
Un nouveau...

ViPHP
ViPHP | 1136 Messages

06 oct. 2009, 12:02

Peux tu nous montrer des exemples ?

sur quelle chaine tests tu ? que l'on puisse comparer de notre coté .

htmlentities( $montexte , ENT_QUOTES , 'UTF-8' )
html_special_chars( $montexte , ENT_QUOTES , 'UTF-8' )


strtr( $montexte , get_html_translation_table(HTML_ENTITIES, ENT_QUOTES) )
strtr( $montexte , get_html_translation_table(HTML_SPECIAL_CHARS, ENT_QUOTES) )

Ensuite , il y a des différences , dans les ligne .. htmlentities et html_special_chars tel que tu nous les présentes , encode en utf-8 , alors que strstr reste par defaut en ISO iso-8859-1

Il faut donc encoder en utf-8 pour comparer exactement .

Mammouth du PHP | 2937 Messages

06 oct. 2009, 12:22

Soit dit en passant, le nom de la fonction htmlspecialchars () s'écrit tout attaché. ;)

Kran
Invité n'ayant pas de compte PHPfrance

06 oct. 2009, 12:37

Merci bien pour cette précision fort à propos Mr BRITO !

A la demande de stopher, Voici-voila le petit bout de code qui m'a permis de tester :
 $montexte=' toto é pà content > ';
 $conn = odbc_connect('PicoDoc','','') or die("dead conn");
 
 $ma_cle='ma_cle_1';
 $montexte_a_inserer=strtr($montexte , get_html_translation_table(HTML_ENTITIES) );
 $sql = 'INSERT INTO Verbose ([value],[verbose]) VALUES (\''.$ma_cle.'\',\''.$montexte_a_inserer.'\')';
 odbc_exec($conn,$sql) or die("<br/>INSERT 1 : Erreur ".odbc_error($conn)."<br/>".odbc_errormsg($conn)."<br/>".$sql );
 
 $ma_cle='ma_cle_2';
 $montexte_a_inserer=htmlentities( $montexte , ENT_QUOTES , 'UTF-8' );
 $sql = 'INSERT INTO Verbose ([value],[verbose]) VALUES (\''.$ma_cle.'\',\''.$montexte_a_inserer.'\')';
 odbc_exec($conn,$sql) or die("<br/>INSERT 2 : Erreur ".odbc_error($conn)."<br/>".odbc_errormsg($conn)."<br/>".$sql );
 
 $ma_cle='ma_cle_3';
 $montexte_a_inserer=strtr( $montexte , get_html_translation_table(HTML_SPECIALCHARS) );
 $sql = 'INSERT INTO Verbose ([value],[verbose]) VALUES (\''.$ma_cle.'\',\''.$montexte_a_inserer.'\')';
 odbc_exec($conn,$sql) or die("<br/>INSERT 3 : Erreur ".odbc_error($conn)."<br/>".odbc_errormsg($conn)."<br/>".$sql );

 $ma_cle='ma_cle_4';
 $montexte_a_inserer=htmlspecialchars( $montexte , ENT_QUOTES , 'UTF-8' );
 $sql = 'INSERT INTO Verbose ([value],[verbose]) VALUES (\''.$ma_cle.'\',\''.$montexte_a_inserer.'\')';
 odbc_exec($conn,$sql) or die("<br/>INSERT 4 : Erreur ".odbc_error($conn)."<br/>".odbc_errormsg($conn)."<br/>".$sql );
 
 odbc_close($conn);
Et voici-voila ce que j'obtiens dans ma base :
  • ma_cle_1 : toto &eacute; p&agrave; content >
    ma_cle_2 : toto é pà content >
    ma_cle_3 : toto é pà content >
    ma_cle_4 : toto é pà content >
Et sur-ce, une petite constatation supplémentaire : Si j'enlève les 'UTF-8' j'obtiens en effet le comportement attendu :? ...
Ce que je ne comprends pas vraiment c'est que dans le même contexte (même serveur web, même type de DBB, mêmes en-têtes HTML, même tout quoi...) j'obtenais bien le comportement attendu avec la fonction telle que je l'ai écrite en premier lieu sur une autre appli...

Explication :( ?

Kran
Invité n'ayant pas de compte PHPfrance

06 oct. 2009, 13:03

Petite question subsidiaire...

Les seules différences potentielles que je verrais entre mes deux applis sont :
  • l'une est "full ajax" et que l'autre ne l'est pas (en tous cas, pas pour cette partie...)
  • l'une a ses scripts javascript directement écrit dans la page web tandis que l'autre les inclus par une balise de type <script type="text/javascript" src="../scripts/DocValid.js"></script>
Y'aurait-il par hasard une translation de charset effectuée a la volée lors de l'appel d'une fonction javascript dans l'un de ces cas :? ?

Kran
Invité n'ayant pas de compte PHPfrance

06 oct. 2009, 15:02

Ha bé voila...

Ajax encode par défaut les données renvoyées en UTF-8 ... j'ai envie d'dire que ça s'invente pas !

Pkoi Ajax n'encode t'il pas par défaut dans le même charset par défaut que ses p'tits copains ? Cela reste un mystère pour moi ! Mais en tout cas tout s'explique :roll:
Toujours est-il que j'ai auto-résolu mon problème :D ! Et si un quelqu'un bien intentionné voulait bien gentilment passer le sujet en résolu, je lui en serai fort gré étant donné que je suis un vilain même pas enregistré ^^

Merci pour votre aide
++