Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > AJAX
AJAX Forum sur la programmation AJAX. Avant de poster : Cours AJAX, FAQ AJAX, Toutes les FAQ JavaScript
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 28/07/2011, 09h52   #1
Candidat au titre de Membre du Club
 
Inscription : avril 2011
Messages : 29
Détails du profil
Informations forums :
Inscription : avril 2011
Messages : 29
Points : 11
Points : 11
Par défaut Symbole euro et AJAX

Bonjour amis développeurs

Pour commencer, je m'excuse mais malgré l'intitulé connu sur ce forum (et bien d'autres), et après moultes et moultes recherches croyez-moi, je n'ai encore trouvé à cette heure aucune discussion concernant exactement le problème auquel je suis confronté...

J'ai tout d'abord cru que mon soucis venait de l'encodage de mes bases de données, qui est en utf8_general_ci, mais il n'en est rien en fait

Donc...
Primo j'ai un formulaire utilisateur (le bête formulaire pour que le gars qui surfe sur mon site puisse poster un message sur le forum...), jusque là aucun problème.

Code :
1
2
3
4
5
6
7
8
9
10
<form action="javascript:enregistrerMessage('nouveau_message', 1);" name="nouveau_message">
	<p class="entete_p">Corps du message</p>
	<div id="champ_form"><textarea class="champ_texte" name="texte" cols="40" rows="15"></textarea></div>
 
	<div class="entete_p">
		<p><input name="bouton_preview" type="button" value="Prévisualiser" onclick="javascript:preview('nouveau_message', 'texte');" />
		<input name="bouton_poster" type="submit" value="Poster" />
		<input name="bouton_brouillon" type="button" value="Enregistrer le brouillon" disabled="disabled" /></p>
	</div>
</form>
Je traite tout ça via la fonction Javascript "enregistrerMessage( )" pour appeler un script AJAX afin d'insérer le message dans ma base de données :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function enregistrerMessage(formulaire, id_sujet) {
	var formu = document.forms[formulaire];
	document.getElementById("erreurs").innerHTML = "";
	document.getElementById("erreurs").style.display = "none";
	formu.elements["texte"].style.border = "1px solid #99C500";
	if (formu.elements["texte"].value != "") {
		formu.elements["bouton_poster"].value = "Enregistrement en cours...";
		formu.elements["bouton_poster"].disabled = true;
		module_AJAX("./?page=nouveaumessage_ajax&s="+id_sujet, constructData(formulaire), resultatEnregistrementMessage);
	} else {
		$("#erreurs").slideDown("fast");
		if (formu.elements["texte"].value == "") {
			formu.elements["texte"].style.border = "1px solid #FF0000";
			document.getElementById("erreurs").innerHTML += "Texte manquant<br />";
		}
	}
}
Jusque là encore, tout va bien, mes alert( ) au niveau Javascript me renvoient le bon texte saisi, accents, balises, symbole €, etc...

Là ou ça a commencé à dérailler, c'est quand j'ai regardé le contenu de ma base de données la première fois... Le symbole € était remplacé par le fameux %u20AC (même plus besoin de chercher le code, je commence à le connaitre par coeur...) !
Je suis donc remonté un peu dans la chaine d'enregistrement, et je me suis aperçu donc que sur le fichier PHP appelé par AJAX qui traite l'info, mon symbole € n'apparait pas comme il faut... Toujours ce fichu %u20AC !

Donc afin de vous éclairer sur mon environnement, déjà, je travaille sur Firefox (toutes mises à jour faites), mais le soucis apparait également sur Chrome ou IE<last>...
Ma page HTML débute par un DOCTYPE pour HTML5, et j'utilise la balise méta suivante (et j'y tiens) :

Code :
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-15" />
Mes scripts AJAX contiennent, côté PHP, la ligne de commande :

Code :
header('Content-Type: text/xml;');
et côté "template", le code suivant :

Code :
<?xml version="1.0" encoding="ISO-8859-15" ?>
Pour ma recherche de solutions, j'ai tenté toutes les combinaisons d'encodage de mes pages, j'ai également tenté d'utiliser la fonction "urldecode( )" au niveau du script PHP qui récupère les données... sans plus de résultats...

Côté Javascript sur le traitement AJAX, j'ai un "escape( )" pour mettre en forme les données à envoyer au script... Si je l'enlève c'est encore pire (normal)...

Si vous avez une solution, une piste, un rien qui puisse m'aider, je vous en remercie d'avance !
briceparmentier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/07/2011, 10h08   #2
Responsable Développement Web

 
Avatar de Bovino
 
Homme Didier Mouronval
Développeur Web
Inscription : juin 2008
Messages : 13 807
Détails du profil
Informations personnelles :
Nom : Homme Didier Mouronval
Âge : 41
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2008
Messages : 13 807
Points : 35 793
Points : 35 793
Citation:
J'ai tout d'abord cru que mon soucis venait de l'encodage de mes bases de données, mais il n'en est rien en fait
Permet-moi d'en douter

Citation:
qui est en utf8_general_ci
Code :
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-15" />
au passage, en HTML5, <meta charset="ISO-8859-15" />, suffit
Code :
<?xml version="1.0" encoding="ISO-8859-15" ?>
à moins que pour toi l'UTF-8 et l'ISO-8859-1 soient équivalents, il y a de fortes chances que ça vienne de là
Tu peux toujours essayer d'utiliser utf8_decode() après récupération dans la base...
__________________
Pas de question technique par MP !
Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
Vous possédez un blog et aimeriez diffuser vos billets sur le forum, contactez-moi !
Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
Mon livre sur jQuery
Bovino est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/07/2011, 10h14   #3
Candidat au titre de Membre du Club
 
Inscription : avril 2011
Messages : 29
Détails du profil
Informations forums :
Inscription : avril 2011
Messages : 29
Points : 11
Points : 11
Salut Bovino, merci pour ta réponse, je vais étudier ça

Je viens de faire un nouveau test... Dans ma base de données toujours en utf8_general_ci, je rentre manuellement le symbole € dans le corps du message (et il est bien pris en compte dans l'affichage avec phpmyadmin).

Accrochez-vous : à l'affichage sur le site il faut que je sois en ISO-8859-1, sinon le symbole € ne s'affiche pas (losange avec '?' en utf8 et carré bizarre en ISO-8859-15)...

Or si je ne me trompe pas, le symbole € est censé être pris en compte A PARTIR de ISO-8859-15, pas par ISO-8859-1... Non ?

Cela pourrait-il venir de mon DOCTYPE pour HTML5 ?
briceparmentier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/07/2011, 10h14   #4
Membre éclairé
 
Avatar de brachior
 
Homme Jérôme Pilliet
Étudiant
Inscription : mai 2011
Messages : 190
Détails du profil
Informations personnelles :
Nom : Homme Jérôme Pilliet
Âge : 25
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mai 2011
Messages : 190
Points : 305
Points : 305
AJAX utilise l'UTF8 (du au XML), pas l'ISO, donc il te faut convertir ...
Le problème, c'est que la majorité des fonctions ne permettent que la conversion UTF8 <-> ISO-8859-1

Vu que tu tiens énormément à rester en ISO (=/),
Il faut faire un traitement particulier pour les caractères qui ne sont pas ISO-8859-1 ...
brachior est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/07/2011, 10h18   #5
Candidat au titre de Membre du Club
 
Inscription : avril 2011
Messages : 29
Détails du profil
Informations forums :
Inscription : avril 2011
Messages : 29
Points : 11
Points : 11
Citation:
Envoyé par brachior Voir le message
Vu que tu tiens énormément à rester en ISO (=/),
Est-ce vraiment mal ?

Si je préfère rester en ISO, c'est parce que ça me gonfle de devoir taper le code pour tous les accents dans les textes qui sont en dur dans mon template...

Merci pour vos messages en tous cas
briceparmentier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/07/2011, 10h23   #6
Responsable Développement Web

 
Avatar de Bovino
 
Homme Didier Mouronval
Développeur Web
Inscription : juin 2008
Messages : 13 807
Détails du profil
Informations personnelles :
Nom : Homme Didier Mouronval
Âge : 41
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2008
Messages : 13 807
Points : 35 793
Points : 35 793
Citation:
c'est parce que ça me gonfle de devoir taper le code pour tous les accents dans les textes qui sont en dur dans mon template...
Ben raison de plus pour tout passer en UTF-8

Passez à l'UTF-8 sans manquer une étape
__________________
Pas de question technique par MP !
Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
Vous possédez un blog et aimeriez diffuser vos billets sur le forum, contactez-moi !
Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
Mon livre sur jQuery
Bovino est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/07/2011, 10h28   #7
Candidat au titre de Membre du Club
 
Inscription : avril 2011
Messages : 29
Détails du profil
Informations forums :
Inscription : avril 2011
Messages : 29
Points : 11
Points : 11
Citation:
Envoyé par Bovino Voir le message
Ben raison de plus pour tout passer en UTF-8

Passez à l'UTF-8 sans manquer une étape
C'est là que je ne comprend pas en fait :s Je n'ai pas besoin de taper le code HTML de chaque accent en ISO...

Sinon pour l'encodage de mon fichier, j'avoue que j'ai du mal à comprendre en quoi le fait d'enregistrer en UTF8 change quelque chose étant donné que je spécifie un charset à ma page HTML, et que mes fichiers de template (contenant donc mon code HTML + texte brut) sont chargés via PHP...

Merci pour ton lien
briceparmentier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/07/2011, 11h00   #8
Membre éclairé
 
Avatar de brachior
 
Homme Jérôme Pilliet
Étudiant
Inscription : mai 2011
Messages : 190
Détails du profil
Informations personnelles :
Nom : Homme Jérôme Pilliet
Âge : 25
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mai 2011
Messages : 190
Points : 305
Points : 305
Le fichier php/html/... sont de simples fichiers ...
Ils ont leur propre encodage ...
Et n'ont aucun rapport avec une balise (ou autre) écrite dans ce fichier ...

La balise va dire à html "tiens, mes données sont comme ça" ...
Il faut donc que le fichier soit aussi dans cette encodage ...

Passer en UTF8 te permet d'avoir la quasi totalité des caractères de ce monde
(japon/russe/chine/...) (il existe jusqu'à UTF32 ... mais osef )
Le seul soucis reste PHP qui n'est pas natif pour UTF8 ...
Mais avec un peu d'huile de coude ça passe nickel
brachior est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/07/2011, 11h05   #9
Candidat au titre de Membre du Club
 
Inscription : avril 2011
Messages : 29
Détails du profil
Informations forums :
Inscription : avril 2011
Messages : 29
Points : 11
Points : 11
Merci pour les explications (ton lien Bovino m'a bien aidé), j'avoue avoir du mal encore avec les histoires d'encodage

Je viens de tout passer en utf8, j'ai encodé mes fichiers en UTF8 dans Notepad++, ça marche...

J'ai également rajouté la ligne
Code :
mysql_set_charset ('utf8');
au niveau de mes requêtes SQL (j'ai une classe qui me gère ça donc aucun soucis de devoir le faire sur tous mes fichiers).
Les données qui sont déjà en base sont bien lues et apparaissent correctement.

Seul hic, j'ai un autre soucis maintenant : tous les accents que je saisis dans mon message n'apparaissent plus quand ils sont enregistrés en bdd, ça me coupe même tout ce qui est après le premier accent...

Désolé mais je commence à perdre un peu les pédales là, je ne sais plus trop ou donner de la tête
briceparmentier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/07/2011, 11h49   #10
Membre éclairé
 
Avatar de brachior
 
Homme Jérôme Pilliet
Étudiant
Inscription : mai 2011
Messages : 190
Détails du profil
Informations personnelles :
Nom : Homme Jérôme Pilliet
Âge : 25
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mai 2011
Messages : 190
Points : 305
Points : 305
L'encodage c'est pas une chose simple =/

On peut voir la façon dont tu écris et récupères dans la BDD, comment tu écris dans l'html, ... ?

Je te passes un petit fichier que j'avais fait pour m'aider pour l'encodage
(fait maison et avec des bouts trouvés par ci par là sur le net ^^)
Peut être te sera t-il utile à toi aussi ^^
Fichiers attachés
Type de fichier : php fonctions.php (9,1 Ko, 9 affichages)
brachior est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/07/2011, 17h58   #11
Candidat au titre de Membre du Club
 
Inscription : avril 2011
Messages : 29
Détails du profil
Informations forums :
Inscription : avril 2011
Messages : 29
Points : 11
Points : 11
Me revoici par là Merci pour ton message brachior !

Donc... Par où commencer ?
Déjà, je travaille en PHP objet, donc j'ai une première classe qui instancie la base du site... J'ai donc ensuite pour une page xxx demandée, un fichier xxx.php qui contient les sources, et un fichier xxx.tpl qui contient la mise en page (le truc classique du système de template quoi ).

Pour tout ce qui est des requêtes SQL, j'ai une classe qui gère tout, dans laquelle j'ai intégré la ligne de commande dont on parlait plus haut : mysql_set_charset ('utf8');
J'utilise bien entendu cette même classe pour ce qui est de lire dans la base de données...

Pour ce qui est de la compilation du code HTML généré, j'ai donc mon fichier .tpl contenant des {VARIABLE} que je viens remplacer par la donnée requise via le fichier PHP et une nouvelle classe que j'ai nommée "Afficheur" (qui s'occupe de tout le tintouin de compilation).
Chaque fichier .tpl est chargé avec la méthode "file_get_contents" de PHP.

Ce n'est pas que je ne veuille pas mettre mes codes ici, puisque je n'ai fait que m'inspirer de codes et de méthodes existants, mais ce serait surement lourd et indigeste !

Je vais regarder ton fichier brachior, merci encore à tous
briceparmentier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/07/2011, 18h20   #12
Candidat au titre de Membre du Club
 
Inscription : avril 2011
Messages : 29
Détails du profil
Informations forums :
Inscription : avril 2011
Messages : 29
Points : 11
Points : 11
Bon, un exemple concret de mon code. Sur chaque formulaire de message, j'ai un bouton "Prévisualiser", que je traite en AJAX.

Voici le code PHP du script appelé par AJAX :
Code :
1
2
3
4
5
6
7
8
9
10
<?php
// script appelé par AJAX pour prévisualiser un message
header('Content-Type: text/xml;');
 
// récupération du message à traiter
$texte = $_POST['texte'];
 
$this->afficheur->ajouterVar('CODE', stripslashes (htmlspecialchars (Message::miseEnForme (nl2br ($texte)))));
 
?>
et voici le fichier template associé :
Code :
1
2
3
4
<?xml version="1.0" encoding="UTF-8" ?>
<ajax>
	<preview>{CODE}</preview>
</ajax>
J'ai beau tester toutes les combinaisons d'encodage, dans la balise entête du XML comme dans la commande header( ) de PHP, rien ne passe
Le Javascript en callback ne s'exécute pas car le XML est "mal formé" vu qu'il contient des caractères chelous, carrés blancs et autres losange à '?'...
J'ai testé un
Code :
$texte = utf8_decode ($_POST['texte']);
mais rien à faire, j'ai un joli '?' à la place de mon premier accent et tout ce qui suit est zappé...

Pour charger mon fichier .tpl, j'utilise le code suivant (ici tiré de ma classe, donc ce n'est que l'essentiel, le reste n'est que vérifications et conditions) :
Code :
1
2
3
4
5
6
7
8
9
10
if (file_exists ('./themes/'.$this->theme.'/'.$this->langue.'/'.$this->page.'.tpl')) {
 
	$temp_contenu_page = file_get_contents ('./themes/'.$this->theme.'/'.$this->langue.'/'.$this->page.'.tpl');
	$this->ajouterVar('CONTENU', $temp_contenu_page);
 
} else {
 
	$this->ajouterVar('CONTENU', 'Impossible d\'intégrer le contenu de la page, fichier inexistant !');
 
}
La compilation du code avec les variables se fait à l'aide d'un str_replace (ou du preg_replace / preg_match selon le cas) plongé dans un fatras de switch qui n'entre pas en compte dans l'encodage (en tous cas je l'espère)...

Petite précision : sous Notepad++ j'ai encodé et enregistré tous mes fichiers (sources, classes, templates) en UTF-8 sans BOM...

J'en perd mon latin (enfin plutôt mon UTF-8 ) là, je craque
briceparmentier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/07/2011, 18h57   #13
Candidat au titre de Membre du Club
 
Inscription : avril 2011
Messages : 29
Détails du profil
Informations forums :
Inscription : avril 2011
Messages : 29
Points : 11
Points : 11
Bon je suis un boulet, j'ai rajouté un p'tit htmlentities et mes accents sont passés...
Tout fonctionne donc correctement en UTF-8 (hormis le fait que ma base de données va devoir subir quelques agrandissements vu que chaque caractères spécial est enregistré par son code html &eaigu; et patata...) !

Mon problème initial reste cependant toujours présent : ce fichu € ne passe pas, il est toujours remplacé par le %u20AC
briceparmentier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/07/2011, 09h36   #14
Membre éclairé
 
Avatar de brachior
 
Homme Jérôme Pilliet
Étudiant
Inscription : mai 2011
Messages : 190
Détails du profil
Informations personnelles :
Nom : Homme Jérôme Pilliet
Âge : 25
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mai 2011
Messages : 190
Points : 305
Points : 305
Comme dit précédemment,
Les méthodes de conversions ramènent à l'ISO-8859-1 (qui ne possède pas le symbole € par exemple),
Il te faut les traiter "à la main" ...
Regarde les fonctions que je t'ai données (utf8_real_encode - utf8_real_decode)
Elles doivent faire le boulot normalement ^^
brachior est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/07/2011, 10h36   #15
Candidat au titre de Membre du Club
 
Inscription : avril 2011
Messages : 29
Détails du profil
Informations forums :
Inscription : avril 2011
Messages : 29
Points : 11
Points : 11
Mouarf, j'avais oublié ce détail.... Merci brachior !
briceparmentier est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h33.


 
 
 
 
Partenaires

Hébergement Web