caractéres spéciaux

Répondre
subrally
le 28/07/2009 à 15:26
subrally
bonjour

j'ai un probléme avec les caractére spéciaux cad que qd je rentre un texte dans la base de donnée j'utilise: mysql_escape_string($_POST['commentaire'])

et pour afficher: nl2br(stripslashes(htmlentities(trim($row["commentaire"]))))

mais quand il y a des é, /, " etc il m'affiche des truc du style é, j'ai tous essayé mais je n'arrive pas a résoudre mon probléme
merci
LA GLOBULE
le 28/07/2009 à 20:18
LA GLOBULE
Alors, c'est simple, tu as un problème de charset.

Voici ce qu'il faut faire :
1) choisir un charset :p (UTF-8 ou ISO-8859-1 ou ce que tu veux)
2) une fois le charset choisi, il faut configurer ton éditeur de texte pour utiliser ce charset
3) Il faut faire en sorte de dire à apache de servir tes pages avec le charset que tu as choisis (tu peux utiliser la fonction header de php pour cela)
4) Configurer ta base SQL en utilisant les collate appropriées à ce charset
5) Quand tu initialises ta connexion SQL, il te faut dire à MySQL quel charset tu comptes utiliser, pour cela, tu peux faire un mysql_query de la requete "SET NAMES 'utf8'" et de "SET CHARACTER SET utf8" (si tu souhaites utiliser l'UTF-8)).

Alors bien sur, cela peu paraitre chiant, et toutes ces vérifications ne sont pas necessaires (certains trucs par defaut peuvent faire que ton code fonctionne, mais il vaut mieux tout vérouiller).
LA GLOBULE
le 29/07/2009 à 00:04
LA GLOBULE
Marrant, je ne connaissais pas cette fonction :)

Comme quoi, avec preque 9 ans de PHP dans les dents ben on en apprend encore.
subrally
le 29/07/2009 à 12:26
subrally
bon voila
1) UTF-8 j'ai choisit :p
2)que veut tu dire par "configurer ton éditeur de texte pour utiliser ce charset"
3) j'ai bien lu la doc et tous mais j'voie pas du tous comment faire
4) ma base sql est déja en utf-8: "Jeu de caractères pour MySQL: UTF-8 Unicode (utf8)"
5) il faut le faie a chaqus requete mysql? y a pas un truc a initialisé au debut pour éviter de le faire a chaques fois?

merci,

sinon j'ai trouvé une solution un peu "barbare" lol

nl2br(stripslashes(htmlentities(trim(caractere_speciaux($row["texte_commentaire"])))))

je me suis fait une fonction caractere_speciaux qui ne sont pas pris en compte (y en a une 15aine)

par exemple: $message = str_replace("é","é",$message);
LA GLOBULE
le 29/07/2009 à 12:34
LA GLOBULE
Le fait que tu n'ais pas compris le 2) et ta fonction caractere_speciaux me font douter sur le fait que tu ais compris le problème.

Tes caractères louches ne sont pas des "caractères spéciaux" comme tu le dis, mais des caractères comme les autres.
Seulement, tu les affiches "mal".

Si tu prend le caractère 'é' encodé en ISO-8859-1, celui ci prendra 1 octet en mémoire.
Le même catactère 'é' encodé en UTF-8 prendra 2 octets en mémoire et il s'affichera 'é' sur une page UTF-8, et il s'affichera 'é' sur une page ISO-8859-1 (les 2 octets).

Le 'é' est juste la représentation ISO-8859-1 du caractère UTF-8 'é'.

Sinon, pour en revenir au 2), moi mon éditeur de texte a dans ses options un truc qui dit "utiliser l'encodage de caractère ... pour sauvegarder les fichiers" et je choisis UTF-8 (c'est ton éditeur qui va encoder tes 'é' sur 2 octets, automatiquement).

Pour le 3), il te suffit de faire un header('Content-type: text/html; charset=utf-8'); avant d'afficher ton html.

Enfin pour le 5), il faut le faire juste une fois par session de communication avec MySQL.
subrally
le 29/07/2009 à 14:11
subrally
ok j'ai fait tous sa ca marche niquel merci :)

mais...
$result = mysql_query("SET NAMES 'utf8'");
$result = mysql_query("INSERT INTO news_commentaire.....");

faire a chaques fois ce SET NAMES avant je trouve pas sa pratique (j'ai pas envie de faire mes modif dans toute mes pages lol:p) y a pas un truc plus pratique?

sinon j'ai un soucis qui est apparu: cad quand je tape "à)" il me met le smilies correspondant à ";)" que je fait changer par
$message = str_replace(";)", '<img src="/images/smilies/wink.gif" alt=";)">', $message);
je voie pas pk :/
LA GLOBULE
le 29/07/2009 à 15:35
LA GLOBULE
Enfin pour le 5), il faut le faire juste une fois par session de communication avec MySQL.


Donc ce set names, tu as à le faire qu'une fois, idéalement juste après ton mysql_connect.

Ensuite, pour tes smileys, sache que beaucoup de fonction de chaine de caractères ne sont pas compatibles UTF-8 dans PHP. PHP6 corrigera ce soucis.
Je te suggere de lire le manuel PHP concernant l'extension mbstring.

En effet, beaucoup de fonction de PHP se basent sur des octets et nom les caractères pour faire des calculs. Comme en UTF-8 un caractère peut être encodé sur 2 octets, ces fonctions retourneront un résultat faux.

Exemple :
<?php
$str = 'école';
echo strlen($str);
echo mb_strlen($str);
?>


Si tu es en UTF-8, le premier echo affichera 6, le deuxième 5.

Et aussi si tu utilises les fonctions mbstring, il te faudra configurer l'environnement pour dire à mbstring que tu travailles en UTF-8 (tout est expliqué dans la doc).
subrally
le 29/07/2009 à 16:01
subrally
PHP Version 4.4.9 j'ai cette version de php ca m'a l'air un peu vieux non? je suis hebergé chez OVH

je voie ce que tu vas dire, mnt j'vais bien m'amuser avec cette doc, tous ca a cause du smilie pourris pff :p

merci bcp :)
Répondre
LoadingChargement en cours