[RESOLU] Ecriture utf8 en base

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] Ecriture utf8 en base

Re: Ecriture utf8 en base

par Zaqen » 07 août 2019, 15:31

Idem :
Saïan,

J'ai effectivement viré les htmlentities, sur certain champs et ça à l'air de marcher nickel....
Je te reconfirme en allant un peu plus loin dans la supression des htmlentities

Re: Ecriture utf8 en base

par Saian » 07 août 2019, 15:12

D'après la doc le flags par défaut c'est plutôt ENT_COMPAT | ENT_HTML401

Re: Ecriture utf8 en base

par Zaqen » 07 août 2019, 15:05

Tu me régales !

Oui tout bon niveau système et des locales.

Version de php 5.3.3

Je comprends mieux, je vais essayer ENT_COMPAT, 'UTF-8' pour voir

Re: Ecriture utf8 en base

par Saian » 07 août 2019, 14:38

Oué, comme si htmlentities travaillait en ISO-8859-1 alors qu'en l’occurrence il serait sensé travailler en UTF-8 étant donné la valeur de ini_get('default_charset').
https://www.php.net/manual/fr/function.htmlentities.php troisième paramètre $encoding
https://www.php.net/manual/fr/function.utf8-decode.php Convertit une chaîne UTF-8 en ISO-8859-1

PS : si tu fais un locale -a en ssh tu as bien de l'UTF-8 dans la liste ?

PPS : à moins que tu ais une version php < 5.4 alors là ça explique tout, le charset de htmlentities est par défaut l'ISO-8859-1. Et dans ce cas il faudrait faire du htmlentities($string, ENT_COMPAT, 'UTF-8'). C'est important de bien lire la documentation des fonctions. ^^

Si omis, la valeur par défaut du paramètre encoding varie suivant la version PHP utilisée. En PHP 5.6.0 et suivants, l'option de configuration default_charset sera utilisée comme valeur par défaut. En PHP 5.4 et 5.5, UTF-8 sera la valeur par défaut. Pour les versions plus anciennes, PHP utilisera ISO-8859-1.

Re: Ecriture utf8 en base

par Zaqen » 07 août 2019, 14:24

Je peux te faire passer le projet si tu trouves ;-)

Re: Ecriture utf8 en base

par Zaqen » 07 août 2019, 14:21

En base c'est écrit en utf8, le joël est : Jo&euml;l

C'est embêtant

Re: Ecriture utf8 en base

par Saian » 07 août 2019, 13:49

Oué ben c'est quand même étrange car un utf8_decode convertie la chaine considérée comme utf-8 en iso-8859-1. Et si le htmlentities et le strtolower font bien leur travail, ça suggère que php utilise en interne le charset iso-8859-1, ce qui contredit la valeur retournée par le ini_get... à moins que strtolower et compagnie fonctionne en iso ou détecte l'encodage de la chaine ?

PS : en fait il semblerait que strtoupper et strtolower ignorent les caractères accentués avec la configuration par défaut. Le htmlentities quand à lui prend normalement par défaut le ini_get('default_charset') mais ça peut aussi être l'utf-8 selon la version de php... ça semble quand même étrange que le htmlentities sur l'utf8_decode fonctionne comme il faut.

Re: Ecriture utf8 en base

par Zaqen » 07 août 2019, 13:46

j'ai pas mal galéré à tout mettre au point, je vais resté la dessus pour l'instant.

Tu as en tout point raison puor les utf8_encode / decode

Re: Ecriture utf8 en base

par Zaqen » 07 août 2019, 13:45

Quand on ne voit plus rien il vaut mieux fermer les yeux et les réouvrir... je viens de passer la variable
prenom='".ucfirst( strtolower(htmlentities(utf8_decode($frm['prenom']))))."'

avec un utf8_decode, et c'est tout bon =D> :roll:

Merci beaucoup de ton oeil en tout point avisé

Re: Ecriture utf8 en base

par Saian » 07 août 2019, 13:39

Bah franchement j'éviterais d'avoir à utiliser des utf8 encode et decode partout. Je ferais en sorte que ça fonctionne comme ça doit. Comprendre d'où vient le problème et y remédier.

Tu es bon au niveau du charset php. Peut être un problème au niveau du html alors ?
Tu peux faire un echo de la variable avant insertion avec et sans htmlentities voir si c'est comme il faut. Et tu peux faire un double htmlentities pour l'affichage pour qu'il t'affiche les &entityName; sans avoir à regarder dans le code source de la page.

Re: Ecriture utf8 en base

par Zaqen » 07 août 2019, 13:36

tu peux me dire comment tu mettrais le utf8_encode sur chaque ligne stp ?
 echo "<tr>";
        echo "<td>".$row->nummandataire."</td>";
        echo "<td>".$row->numcandidat."</td>";
        echo "<td>".$row->genre."</td>";
        echo "<td>".$row->nom."</td>";
        echo "<td>".$row->prenom."</td>";
        echo "<td>".$row->adresse1."</td>";
        echo "<td>".$row->adresse2."</td>";
        echo "<td>".$row->codepostal."</td>";
        echo "<td>".$row->ville."</td>";
       /* echo "<td>".$row->tel."</td>"; */
        echo "<td>".$row->portable."</td>";
        echo "<td>".$row->email."</td>";
        echo "<td><a href=carnet-view-edit.php?carnetclef=$row->carnetclef class=links>Cliquez ici</a></td>";
        echo "</tr>";

Je pers patience ça fait 3 jours que j'essai de resoudre cette m..... #-o

Re: Ecriture utf8 en base

par Zaqen » 07 août 2019, 13:33

Non ça ne veut toujours pas...

Re: Ecriture utf8 en base

par Zaqen » 07 août 2019, 13:31

Merci pour ta réponse, oui j'ai un seul fichier php.ini sur cette distro.
Pour le ini_get('default_charset') , j'ai placé ça :
 echo "ini_get('default_charset') ". ini_get('default_charset')."<br>";

if (!ini_set('default_charset', 'utf-8')) {
echo "could not set default_charset to utf-8<br>";
et mon résultat :

ini_get('default_charset') utf-8

Je fais un test d'insertion

Re: Ecriture utf8 en base

par Saian » 07 août 2019, 12:38

Normalement si le default charset de php est bien l'utf-8, et que tes pages html ont bien le meta charset utf-8 et que la connexion à la base est bien en utf-8, tu n'as aucun traitement particulier à faire. As tu vérifié le bon fichier php.ini ? Peut être vérifie le charset de php au début du script avec un ini_get('default_charset').
En tout cas ne te base pas sur des données déjà vérolées pour savoir si c'est bon ou pas.

Quand tu utilises des fonctions de transformation de chaine genre htmlentities, strtoupper, etc, si le charset php ne correspond pas au charset de la chaîne transmise alors tu t'exposes à des problèmes d'encodage. Mais si le charset est le même, alors pas de problème.

Là d'après ce que tu dis tu as déjà un problème lors de l'enregistrement. Joël qui devient Jo&atilde; déjà le htmlentities ne reçoit pas une chaine utf-8 ou le charset interne de php n'est pas utf-8. Tu devrais avoir Jo&euml;l.

PS : déjà lors de l'enregistrement, tu peux tester un bête echo avant htmlentities pour voir si la chaine s'affiche bien ou pas selon le charset de la page html. Vérifie aussi au niveau du navigateur que l'encodage est bien unicode pour ta page.
Typiquement un ë utf-8 interprété en iso-8859-1 donne ë

Re: Ecriture utf8 en base

par Zaqen » 07 août 2019, 12:23

Bonjour,
oui en effet, et je crois que tu viens de mettre le doigt dessus.
Mais pourtant j'ai bien ça : default_charset = "utf-8"

J'ai rajouté également ça dans le php.ini mssql.charset = "utf-8"

ma dernière solution et je n'ai pas d'autre carte dans ma manche après ça, c'est d'utiliser utf8_encode et utf8_decode

l'encode me donne en base : Jo&atilde; pour la saisie du prénom Joël , et à l'affichage j'ai Joã

l'idée serait d'utiliser utf8_decode mais je n'arrive pas à le placer dans ma boucle :
  echo "<tr>";
        echo "<td>".$row->nummandataire."</td>";
        echo "<td>".$row->numcandidat."</td>";
        echo "<td>".$row->genre."</td>";
        echo "<td>".$row->nom."</td>";
        echo "<td>".$row->prenom."</td>";
        echo "<td>".$row->adresse1."</td>";
        echo "<td>".$row->adresse2."</td>";
        echo "<td>".$row->codepostal."</td>";
        echo "<td>".$row->ville."</td>";
       /* echo "<td>".$row->tel."</td>"; */
        echo "<td>".$row->portable."</td>";
        echo "<td>".$row->email."</td>";
        echo "<td><a href=carnet-view-edit.php?carnetclef=$row->carnetclef class=links>Cliquez ici</a></td>";
        echo "</tr>";