[PHP/MYSQL] Comment traduire les accents ???

Résolu/Fermé
benjam89 Messages postés 3 Date d'inscription samedi 18 août 2007 Statut Membre Dernière intervention 24 septembre 2007 - 18 août 2007 à 16:56
 Tof - 25 août 2016 à 11:18
Bonjour,
J'ai un formulaire d'enregistrement de données du visiteur, et lorsque mon script d'insertion enregistre les données, tout les mots contenant des accents comme é, à, ... dont traduits en code. Comment éviter celà ?

Par exemple, le mot gérez, une fois dans la base de données s'écrit Gérez

Merci de vos réponses

Merci de vos réponse.

18 réponses

Posotaz Messages postés 489 Date d'inscription samedi 23 juin 2007 Statut Membre Dernière intervention 19 juin 2011 225
19 août 2007 à 17:39
Bonjour,

Oulala ces encodages, ce n'est pas le sujet que je préfère :p

L'UTF8 est encore mal géré par les langages de programmation. Nativement, le PHP 5 (et en dessous) ne le gère pas et il faut utiliser les fonctions utf8_decode et utf8_encode avant de procéder à l'envoi vers la base de données (supposant qu'elle ait été concue en Unicode).

Une autre idée serait de transformer les caractères accentués en entités HTML. Par exemple le é devient é . Pour ce faire tu as la fonction html_entities et html_decode. Unicode ou pas, les entités HTML utilisent des caractères figurant dans la liste des 127 standarts et en principe ça s'enregistre correctement.

Si tu veux vraiment ne pas te casser la tête, passe entièrement en ISO-8859-1, tu n'auras à faire aucune conversion.

En tout cas il faut suivre une certaine logique :

- Le mode d'enregistrement de ton fichier
- Le charset déclaré en entête de ton fichier HTML
- Le charset de la base de données (de la table et des champs)

doivent avoir le même charset. Et même avec ça, sur base de ce que j'ai dit à propos du PHP qui ne gère pas encore l'UTF8 correctement, ça n'empêchera pas de devoir faire une conversion/reconversion explicite.

Ca fait un petit moment que j'ai terminé un certain projet complètement UTF8 et si je me souviens d'une chose c'est que ça n'a pas été de tout repos et j'ai passé des journées entières à tester les charsets. Donc bon courage !
34
benjam89 Messages postés 3 Date d'inscription samedi 18 août 2007 Statut Membre Dernière intervention 24 septembre 2007
19 août 2007 à 18:13
Merci pour ta réponse, mais j'ai mis en ISO-8859-1, mais c'est exactement la même chose.......

Merci d'avance de vos prochaines réponses !
0
LeSquale35 > benjam89 Messages postés 3 Date d'inscription samedi 18 août 2007 Statut Membre Dernière intervention 24 septembre 2007
19 août 2007 à 20:53
Il faut remplacer les accents (et autres caracteres speciaux) par leur code ISO :
https://www.toutimages.com/codes_caracteres.htm
0
Tout de suite après la connection mysql à la base de données, ajoute cette petite ligne de code:

mysql_query("SET NAMES 'utf8'");

Exemple:
$conn = mysql_connect("$dbhost","$dbuser","$dbpass") or die(mysql_error());
mysql_select_db("$dbname") or die(mysql_error());
mysql_query("SET NAMES 'utf8'");

Ainsi, avec tes pages en UTF-8 et une base en latin1, tout est propre :-))
26
Merci, je me cassais la tête avec un if, avec ça le problème est résolu
0
C la meilleur reponse selon moi :D
0
Merci Mark
cette solution doit recevoir un 20/20

Pieter
0
Guadina Yassine
14 mai 2015 à 11:46
Mise à jour :D

$mysqli = mysqli_connect( ... );
mysqli_set_charset( $mysqli, 'utf8' );
0
Merci beaucoup !
0
$s=iconv("ISO-8859-1","UTF-8",$s);
13
muco45 Messages postés 441 Date d'inscription dimanche 17 février 2008 Statut Membre Dernière intervention 26 novembre 2013 65
6 janv. 2013 à 02:57
merci beaucouppppp
0
une autre possibilité pour résoudre le problème :
-il faut utiliser l'interclassement utf8_general_ci au niveau des colonnes et des tables.
-Dans le head, ajoute ce code: <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-lorsque tu récupère une donnée dans la bd pour afficher, utilise la fonction utf8_encode($string) ou htmlentities($string)
-lorsque tu récupère une donnée via le formulaire, protège la avec la fonction utf8_decode($variable) avec d'enregistrer dans la bd.
8
Merci ça marche parfaitement
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
utiliser simplement la fonction "html_entity_decode($nom_de_la_variable)"
chez moi ça s'affiche nickel
6
Pour ceux qui tomberaient sur ce sujet en quêtes de solution, cette petite fonction resoudra tous vos soucis :

function char($text)
{
	$text = htmlentities($text, ENT_NOQUOTES, "UTF-8");
	$text = htmlspecialchars_decode($text);
	return $text;
}

la première commande transforme tout (accents et balises) en code html
la suivante remet les balises html
au final, seuls les accents sont modifiés

Exemple :

echo char("Hé ! texte a<u>ccen</u>tué");


génère le code html suivant
--> Hé ! texte a<u>ccen</u>tué
qui affiche :
--> Hé ! texte accentué

J'ai trouvé ça sur cette page :
http://www.commentcamarche.net/forum/affich-29465-transformer-les-accents-en-eacute-avec-php
3
Posotaz Messages postés 489 Date d'inscription samedi 23 juin 2007 Statut Membre Dernière intervention 19 juin 2011 225
19 août 2007 à 21:43
Mmmm... Si tout est bien configuré on n'a pas besoin de faire cette conversion, LeSquale35. La conversion en code ISO (et accessoirement en entités HTML) a été introduite afin que le caractère soit affiché correctement quel que soit l'encodage utilisé, lorsque les navigateurs Web du monde entier ne comprenaient pas encore l'entièreté de l'ISO-8859-1 ou étaient incapable d'adapter l'encodage lorsque le concepteur de la page Web n'indiquait pas explicitement le charset (ça arrive encore) <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1" />

L'inconvénient de cette méthode est que le stockage en code prend plus de place (pour un caractère accentué il faut au minimum en utiliser 4).

Benjam89 je n'ai malheureusement rien d'autre à te proposer. Tu dois être certain à 100% que ta table ET tes champs soient en "latin". C'est important de vérifier ça tant au niveau de la table que des champs. Maintenant si tu as déjà encodé quelque chose dans ces tables, le fait de changer l'encodage ne fera pas la conversion de ce qui a déjà été encodé donc ça va rester de l'Unicode. Ca ne peut pas ne pas fonctionner ou alors c'est ton script PHP (si c'est un truc que tu as récupéré quelque part) qui fait cette conversion.
2
StresS Messages postés 12 Date d'inscription dimanche 24 août 2008 Statut Membre Dernière intervention 24 août 2008 5
24 août 2008 à 16:53
htmlentities(); fe ca tres bien ;)
2
MDR effectivement, j'avais complètement zappé cette fonction qui te fera excatement la même chose :D

Il est vrai que safeName me sert plutôt à dégager des caractères spéciaux pour générer des noms de fichiers :p

Ceci-dit il est toujours conseillé de travailler en UTF-8, mais bon, si tu veux que l'UTF-8 te pose aps de soucis, faut absoluement bien enregistrer tes fichiers qui généralement seront en AINSI, sinon même tes ouvertures de sessions ne marcheront pas, une fois que tu y es habitué, ça ne devrait pas te poser de problèmes

PS : merci Stress pour la fonction =)
0
Bon, le forum réécrit le 2e tableau remplacement, il est évident que pour chaque entrée du tableau tu écris la correspondance en html

pour le é par exemple : & e a c u t e ;
2
J'ai eu le même problème avec les accents.lorsque que j'insère une donnée via phpmyadmin, les accents sont pris en compte.par contre lorsque je fais l'enregistrement via l'interface de mon application(la page php) les accents ne sont pas pris en compte.
J'ai pu résoudre le problème en ajoutant <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" /> dans le head.Au niveau de la récupération des données pour enregistrer dans la base,j'ai utilisé la fonction html_entity_decode($nom_variable). Mais pour récupérer les données dans la base et afficher sur le navigateur, j'ai utilisé la fonction htmlentities($nom_variable).
J'utilise mysql 5.5.10 et php 5.3.6 et l'encodage de ma base de données est utf8_general_ci.
Ca marche bien.
2
Bon je vais reposter une réponse, les années ayant passées, le problème de l'utf-8 c'est que ça demande une parfaite gestion de l'encodage, si le site a été construit en iso c'est une galère, mais bon, pas le choix pour du multiling efficace.

Pour la base de donnée, déjà bien penser à la construire en utf-8, sinon au pire vous pouvez toujours rajouter ça après la connexion :

mysql_select_db(_INFOS_DE_CONNEXION_);

mysql_query("SET NAMES utf8");

il est important de récupérer les données dans le bon "format"

Ensuite pour les pages, important aussi que le navigateur les reconnaisse en utf-8

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

Et pour finir le problème de l'utf-8 c'est qu'il faut bien vérifier que ses pages soient encodées en utf-8 (page php, html et même javascript), dreameweaver a la sale habitude de les encoder en iso si il n'y a pas de header déclaré, pour palier ce soucis, sous dreamweaver, faites un contrôle+J ou pomme+J quand la page est ouverte, et dans l'encodage d'enregistrement vérifiez que vous êtes bien en utf-8 et réenregistrez, vous n'aurez plus de problème.

Le seul moment ou vous pourriez avoir besoin de convertir les accents, c'est pour de l'url rewriting pour écrire les urls sans accents, et dans ce cas, appliquez juste un utf8_decode() sur la chaine, puis une fonction classique str_replace(array('é'),array('e'),$string) pour formater la chaine.
2
Normalement c'ets fait en natif selon la configuration du serveur, tu ne devrais pas avoir de soucis avec une base en "Latin"

Par contre si tu passes par de 'lajax pour charger tes pages php, ca sera appelé en UTF-8 généralement, du moins ca va te rapatrier les accents de la base de données sans pour autant te els afficher (ca sera des ?)

Voila une petite fonction pour réécrire les accents tu peux aussi l'utiliser sur els variable avant de les envoyer à la base de données, cependant mieux vaut éviter de stocker de l'hmtl dans ta base, c'ets toujours mieux de stocker tel quel


function safeName($string)
{
$string=strtolower($string);
$patterns = array('/é/','/è/','/ê/','/à/','/â/','/ù/','/ü/','/û/','/ä/','/ë/','/ç/','/ô/','/ö/');
$replacements = array('é','è','ê','à','â','ù','ü','û','ä','ë','ç','ô','ö');
$string=preg_replace($patterns, $replacements, $string);
return $string;
};


Ca reprends les principaux accents, tu peux rajouter à l'infi ce que tu veux remplacer, la je 'mattaque qu'aux minuscules
1
Charly salut

J'ai le problème, des points d'intérrogation, et j'utilise de l'AJAX.. Je voudrais savoir ce qu'il faudrait faire stp, car je ne comprends pas très bien ce que t'as expliker.

Merciii
0
J'ai trouvé ce truc très efficace:

..... WHERE `terme` LIKE CONVERT( _utf8 '%accès%' USING latin1 )
1
rufus_ Messages postés 5 Date d'inscription lundi 10 mars 2008 Statut Membre Dernière intervention 25 janvier 2009
2 nov. 2008 à 09:49
concrètement si on encode tous les fichiers en ISO-8859-15 en quel code doit être la base de données mySQL 5 ?
UTF-8 ? Latin mais lequel ? vu que le ISO-8859-15 = latin 9 et que je trouve que le latin 1 a 7 comme options de la base

merci
0
osjk^ùbhkoer)oblo$)à^fp à^kzeà)$àzfl)$gmprrgcrfggjrtk,ijtfgbCFGR?JTHRRRRRRRRRRRNIOPRETJ?PRFIUP?IOPDF
pour resume je suis daccord avec vous
0
Bonjour,

J'ai trouvé un site qui fait ça, leur code javascript est pas mal simple, seulement quelques lignes.
https://usefulwebtool.com/fr/convertir-entites-html
0
lil@ Messages postés 195 Date d'inscription dimanche 24 août 2008 Statut Membre Dernière intervention 10 décembre 2014 10
11 août 2011 à 00:32
Bonjour,

JE suis en train de créer un site internet. Ne m'y connaissant guère, j'utilise un kit graphique gratuit pour me faciliter la vie. Je rencontre des problèmes avec les accents. J'ai bien compris que chaque caractères spéciaux avait son code ISO. J'ai remplacé quelques accents par les codes correspondants et ça fonctionne. Seulement, faudra-t-il convertir chaque accent un par un ? N'y-a-til pas un moyen simple et rapide pour les convertir. Sinon, je ne suis pas sortie de l'auberge.

Merci de me renseigner ;)
0
lil@ Messages postés 195 Date d'inscription dimanche 24 août 2008 Statut Membre Dernière intervention 10 décembre 2014 10
11 août 2011 à 00:39
Sur NVU, j'ai choisi l'encodage des caractères "Occidental ISO-88-59", mais ça n'a pas l'air de fonctionner :(
0
lil@ Messages postés 195 Date d'inscription dimanche 24 août 2008 Statut Membre Dernière intervention 10 décembre 2014 10
11 août 2011 à 00:39
Merci de m'aider
0
depuis des années j'ai réglé le problème en iso-8859 en déclarant les tables en latin1_swedish_ci.
0