IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AJAX Discussion :

[AJAX] Symbole euro et AJAX


Sujet :

AJAX

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 29
    Par défaut [AJAX] 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-15" />
    Mes scripts AJAX contiennent, côté PHP, la ligne de commande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    header('Content-Type: text/xml;');
    et côté "template", le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <?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 !

  2. #2
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    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

    qui est en utf8_general_ci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-15" />
    au passage, en HTML5, <meta charset="ISO-8859-15" />, suffit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <?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 !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 29
    Par défaut
    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 ?

  4. #4
    Membre expérimenté Avatar de brachior
    Homme Profil pro
    Doctorant
    Inscrit en
    Mai 2011
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Doctorant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2011
    Messages : 190
    Par défaut
    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 ...

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 29
    Par défaut
    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

  6. #6
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    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 !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 29
    Par défaut
    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

  8. #8
    Membre expérimenté Avatar de brachior
    Homme Profil pro
    Doctorant
    Inscrit en
    Mai 2011
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Doctorant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2011
    Messages : 190
    Par défaut
    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

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 29
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  10. #10
    Membre expérimenté Avatar de brachior
    Homme Profil pro
    Doctorant
    Inscrit en
    Mai 2011
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Doctorant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2011
    Messages : 190
    Par défaut
    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 Fichiers attachés

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 29
    Par défaut
    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

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 29
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    $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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 29
    Par défaut
    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

  14. #14
    Membre expérimenté Avatar de brachior
    Homme Profil pro
    Doctorant
    Inscrit en
    Mai 2011
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Doctorant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2011
    Messages : 190
    Par défaut
    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 ^^

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 29
    Par défaut
    Mouarf, j'avais oublié ce détail.... Merci brachior !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 28/07/2009, 13h06
  2. Code ASCII du symbole Euro
    Par FW-S dans le forum Delphi
    Réponses: 9
    Dernier message: 03/04/2007, 01h27
  3. [AJAX] Longeur url pour AJAX
    Par FremyCompany dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 02/03/2006, 14h38
  4. [AJAX] upload fichiers avec AJAX
    Par jibouze dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 08/12/2005, 21h04
  5. [AJAX] Effectuer plusieur appel ajax
    Par shwin dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 06/10/2005, 16h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo