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

JavaScript Discussion :

[AJAX] Caractères bizarres avec AJAX


Sujet :

JavaScript

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2005
    Messages : 98
    Points : 67
    Points
    67
    Par défaut [AJAX] Caractères bizarres avec AJAX
    Bonjour,
    j'utilise actuellement AJAX afin de mettre à jour une liste déroulante LD2 lorsque je modifie une liste déroulante LD1 placé avant dans le
    formulaire. j'ai défini l'evenement onchange pour déclencher la mise à jour de LD2.
    Mon problème est que je fais ma requête de mise à jour dans un fichier .php séparé, mais que cette requête me donne un résutat
    bizarre, c'est à dire qu'elle me remplace le mot électrique par ?ctrique. Par contre electrique passe très bien.
    En fait lorsque j'ai un "é", le "é" et les deux lettres qui le suivent sont remplacées par un "?"
    Est ce que quelqu'un sait d'où ça vient? merci

  2. #2
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    problème d'encoding, pour éviter cela, tu devrais prendre l'habitude de remplacer les caractères spéciaux par leurs entités html (par exemple é pour é tu trouveras facilement une liste via google)

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2005
    Messages : 98
    Points : 67
    Points
    67
    Par défaut
    Le problème est que ces données viennent de ma base de données!
    Et elle est remplie par les utilisateurs, donc je peux pas trop y toucher comme ça

  4. #4
    Membre éclairé Avatar de Death83
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 667
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 667
    Points : 878
    Points
    878
    Par défaut
    Il faut bien définir le meme charset sur toute tes pages (y compris celle appelé par AJAX) et définir le meme charset dans ta bdd.

    Moi j'utilise celui la et j'ai aucun problème:

    header('Content-Type: text/html; charset=ISO-8859-1');

  5. #5
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2005
    Messages : 98
    Points : 67
    Points
    67
    Par défaut
    D accord donc il faut que je jette un oeil aussi dans la BDD, je pense que ça doit venir de la!

  6. #6
    Membre éclairé Avatar de Death83
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 667
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 667
    Points : 878
    Points
    878
    Par défaut
    oui
    si tu prend le meme charset que moi pour la bdd c'est utf8 qu'il faut prendre.

  7. #7
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    Citation Envoyé par Death83
    oui
    si tu prend le meme charset que moi pour la bdd c'est utf8 qu'il faut prendre.
    NON ISO-8859-1 et UTF-8 sont deux charsets différents...

    si tu prends ISO-8859-1, il faut prendre latin1 (c'est un autre nom)

    mais UTF-8 est un encoding Unicode et la plupart des problème d'encoding viennent justement d'uneincompatibilité ISO/UTF

  8. #8
    Membre éclairé Avatar de Death83
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 667
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 667
    Points : 878
    Points
    878
    Par défaut
    Citation Envoyé par Swoög
    NON ISO-8859-1 et UTF-8 sont deux charsets différents...

    si tu prends ISO-8859-1, il faut prendre latin1 (c'est un autre nom)

    mais UTF-8 est un encoding Unicode et la plupart des problème d'encoding viennent justement d'uneincompatibilité ISO/UTF
    CV'est bizarre car je me souviens avoir essayé avec latin et j'avais des problemes avec les caractères spéciaux.

    Depuis que j'ai cette config je n'ai plus jamais eu de problème

  9. #9
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    C'est certainement parce qu'un autre point de liaison entre la BDD et le navigateur fait la conversion (le point de connection entre PHP et la BDD par exemple) mais ISO-8859-1 et UTF-8 sont deux encoding totalement distincts...

    si on ne veut pas avoir de problème, il vaut mieux s'assurer que toute la chaîne est dans le même encoding... et comme pour le moment, les fichiers sont le plus souvent en ISO (8859-1 ou 8859-15) qu'en Unicode... (sauf configuration particulière, ça va de soit)

  10. #10
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2005
    Messages : 98
    Points : 67
    Points
    67
    Par défaut
    D'accord donc il faut que j'essaye de mettre mon code en ISO-8859-1et ma base en latin1!

  11. #11
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    Citation Envoyé par davinout
    D'accord donc il faut que j'essaye de mettre mon code en ISO-8859-1et ma base en latin1!
    et que tu t'assure que tes fichiers .php sont en ISO-8859-1 (sauf configuration particulière, ça devrait être le cas) ainsi que les configuration d'Apache, PHP, MySQL spécifient bien toutes un encoding ISO-8859-1 ou latin1

  12. #12
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2005
    Messages : 98
    Points : 67
    Points
    67
    Par défaut
    Ca me fait des trucs assez bizarres, quelquefois ça marche, après ça marche plus ou alors avec la suite ça ne marche plus, bref je laisse en suspens pour l instant car pas trop de tps à perdre :s

    merci pour vos réponses

  13. #13
    Fabouney
    Invité(e)
    Par défaut
    moi j'ai trouvé une tit astuce pour ce problème de caractère spéciaux dans un innerHTML, à l'issu d'une requête Ajax.
    il suffit de créer un tampon dans le fichier php, qui retourne la chaine (qui va être contenu dans le innerHTML et de l'encoder en UTF-8, avant de l'afficher comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ob_start();
    /****
    le script php ...
    ****/
    $output = utf8_encode(ob_get_contents());
    ob_clean();
    echo $output;
    donc voila, plus de pb d'accents etc après dans le innerHTML.

    si vous avez des remarques merci de m'en faire part.

    Cordialement.

  14. #14
    Membre du Club
    Inscrit en
    Juin 2006
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 60
    Points : 40
    Points
    40
    Par défaut caractere speciaux
    Voilà ce que j'ai trouve pour tes caracteres speciaux
    une fonction php
    function pas_d_accent($str_accent) {
    $pattern = Array("/é/", "/è/", "/ê/", "/ç/", "/à/", "/â/", "/î/", "/ï/", "/ù/", "/ô/");
    // notez bien les / avant et après les caractères
    $rep_pat = Array("e", "e", "e", "c", "a", "a", "i", "i", "u", "o");
    $str_noacc = preg_replace($pattern, $rep_pat, $str_accent);
    return $str_noacc; }

    et ensuite sur ton Post ou Get à l'enregistrement (par exemple sur une variable nom) :
    $nom=pas_d_accent($_POST["nom"]);

    Biensur, pour les valeurs dejà dans ta base, tu exportes ta base, remplace les caracteres et ré-importe ta base

  15. #15
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    moi j'ai utilisé ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    header('Content-Type: text/html; charset=ISO-8859-1');
    pour php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    function encodeMyHtml(valeur) {
        encodedHtml = escape(valeur);
        encodedHtml = encodedHtml.replace(/\//g,"%2F");
        encodedHtml = encodedHtml.replace(/\?/g,"%3F");
        encodedHtml = encodedHtml.replace(/=/g,"%3D");
        encodedHtml = encodedHtml.replace(/&/g,"%26");
        encodedHtml = encodedHtml.replace(/@/g,"%40");
        return encodedHtml;
    }
    pour javascript
    Mais je veux bien une autre solution, merci pour vos posts precedents

  16. #16
    Invité
    Invité(e)
    Par défaut
    Pour palier à ce problème j'utilise la fonction htmlentities dans mes fichiers php, jamais eu aucun souci!

  17. #17
    Membre expérimenté Avatar de davcha
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 258
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 258
    Points : 1 539
    Points
    1 539
    Par défaut
    Citation Envoyé par latrikatomik
    moi j'ai utilisé ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    header('Content-Type: text/html; charset=ISO-8859-1');
    pour php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    function encodeMyHtml(valeur) {
        encodedHtml = escape(valeur);
        encodedHtml = encodedHtml.replace(/\//g,"%2F");
        encodedHtml = encodedHtml.replace(/\?/g,"%3F");
        encodedHtml = encodedHtml.replace(/=/g,"%3D");
        encodedHtml = encodedHtml.replace(/&/g,"%26");
        encodedHtml = encodedHtml.replace(/@/g,"%40");
        return encodedHtml;
    }
    pour javascript
    Mais je veux bien une autre solution, merci pour vos posts precedents
    Ca ressemble à un urlencode ça.

    Sinon, les lignes importantes sont :
    côté php : header('content-type: truc/machin; charset=charset_choisi');
    côté javascript : xhr.setRequestHeader('content-type','blablabla; charset=charset_choisi');

  18. #18
    Rédacteur
    Avatar de marcha
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2003
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 571
    Points : 2 351
    Points
    2 351
    Par défaut
    +1 davcha

    Un détail encore:

    UTF-8 contrairement à ISO-8859-1 n'utilise pas toujours un octet par
    caractère. (à vrai dire, seuls les caractères ASCII 0 à 127) sont codés sur
    un octet. http://fr.wikipedia.org/wiki/UTF-8

    Par exemple, le mot "école" occupe 5 octets en ISO-8859-1 et 6 octets en UTF-8

    Ce qui est traître c'est que si on sauve une chaine UTF-8 dans une base
    mysql en ISO-8859-1, et qu'on la ressort pour l'afficher dans une page html
    UTF-8, ça marche très bien tant que la taille de la chaine encodée ne dépasse pas celle du VARCHAR.

    Il suffit d'un texte composé de beaucoup de caractères non ASCII pour que
    la taille nécessaire passe du simple au double ! Et là... vaut mieux avoir
    une base encodée UTF-8

  19. #19
    Membre expérimenté Avatar de davcha
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 258
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 258
    Points : 1 539
    Points
    1 539
    Par défaut
    Citation Envoyé par marcha
    Il suffit d'un texte composé de beaucoup de caractères non ASCII pour que
    la taille nécessaire passe du simple au double ! Et là... vaut mieux avoir
    une base encodée UTF-8
    C'est pas mieux. Une base UTF-8 avec des caractères latin1, ça aura l'effet inverse : au lieu d'avoir un n° de téléphone à 10 chiffres, tu obtiens un n° de téléphone à 20 chiffres par exemple (ok mauvais exemple, parce que les chiffres à priori c'est 1 octet en UTF-8 et en latin1).

    Mieux vaut utiliser le même charset partout.



    A noter un petit truc concernant ajax tout de même. Si on utilise JSON, et plus particulièrement les fonctions JSON natives de PHP : json_encode et json_decode, ces fonctions ne fonctionnent qu'avec de l'utf-8.
    Ceci dit, on peut se débrouiller en encodant/décodant les données à JSON avant et après le JSONage.

Discussions similaires

  1. [XQUERY] Problème caractères speciaux avec AJAX
    Par patito1975 dans le forum XQUERY/SGBD
    Réponses: 0
    Dernier message: 10/05/2013, 17h45
  2. [AJAX] Caractères accentués avec Ajax
    Par julieng31 dans le forum AJAX
    Réponses: 12
    Dernier message: 25/08/2009, 01h14
  3. perte de balises html avec AJAX super bizarre
    Par shadeoner dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 14/07/2009, 18h23
  4. [AJAX] caractéres speciaux avec ajax
    Par bylka dans le forum AJAX
    Réponses: 2
    Dernier message: 24/06/2009, 16h16
  5. [AJAX] upload fichiers avec AJAX
    Par jibouze dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 08/12/2005, 22h04

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