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 :

caracteres spéciaux, encodeURIComponent incorrect


Sujet :

JavaScript

  1. #1
    Membre à l'essai
    Inscrit en
    Août 2002
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 30
    Points : 14
    Points
    14
    Par défaut caracteres spéciaux, encodeURIComponent incorrect
    Bonjour, j'ai un soucis bizarre en javascript : encodeURIComponent semble mal encoder... Pour illustrer mon probleme j'ai fait un petit code tres simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <html>
    <body>
    <form>
    <input type="text" id="rechercheLibelleReferentiel"/>
    <input type="button" class="BoutonT2" value="Rechercher" onClick='alert(encodeURIComponent(document.getElementById("rechercheLibelleReferentiel").value));' />			
    </form>
    </body>
    </html>
    Quand je tape "è" dans l'alert je me retrouve avec deux caracteres : %C3%A8 . Du coup quand je recupere ca sur mon serveur ca veut plus rien dire deux caracteres pour un... En fait d'apres la table hexa on a:
    Ã => C3
    ¨ => A8

    Je test sous IE ou firefox ca me fait la meme chose. Ca doit etre un probleme de charset mais je ne vois rien de special pourtant... comment bien utilisé le encodeURIComponent pour qu'il me traduise par è => E8 qui est la bonne correspondance?

    Merci d'avance de m'aider.

  2. #2
    Membre à l'essai
    Inscrit en
    Août 2002
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 30
    Points : 14
    Points
    14
    Par défaut
    bon bah comme personne n'a d'idée, je pense repasser derriere le mauvais encodage fait par encodeURIComponent en transformant les suites tel que %C3%A8 par le vrai code %E8 du caractere "è" dans une fonction à la main. Je vais deja faire pour tous les caracteres accentués... tant pis pour les autres caracteres spéciaux.

    Mais si qq'un retrouve une idée n'hesitez pas, je suis souvent sur le fofo

  3. #3
    Membre à l'essai
    Inscrit en
    Août 2002
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 30
    Points : 14
    Points
    14
    Par défaut
    J'ai contourné le probleme en n'utilisant pas encodeURIComponent mais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    escape(libelleRecherche)
    et coté serveur pour moi en java j'ai fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    libelleRecherche=URLDecoder.decode(libelleRecherche, "ISO-8859-1");
    Voila je laisse ouvert le thread car ca m'explique pas pourquoi le encodeURIComponent marche mal mais au moins si qq'un tombe sur le meme probleme a resoudre il a ma solution de secours.

  4. #4
    Membre à l'essai
    Inscrit en
    Juillet 2010
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 13
    Points : 11
    Points
    11
    Par défaut
    Bonjour, je rencontre le même problème.

    Apparemment, c'est dû au fait que encodeURIComponent encode en UTF-8,
    alors que escape encode en latin i.e. ISO-8859-1.

    Le problème est que escape ne convertit pas certains symboles dont "+".

    En attendant mieux, il faut coder sa propre fonction d'encodage :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function escapeURIComponent(str) {  
      return escape(str).replace(/\+/g, '%2B');
    }

  5. #5
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 640
    Points : 66 669
    Points
    66 669
    Billets dans le blog
    1
    Par défaut
    Oulà !!!
    évite de te lancer dans des replaces comme ça, tu tomberas toujours su un caractère oublié ... et gère plutôt le charset ...

    Celui de ton fichier ..
    celui de la balise meta de ta page
    celui du header de ta page
    celui de la source des données ( BDD )
    celui de ton serveur

    un petit topo sur le sujet
    http://j-willette.developpez.com/tut...-site-en-utf8/
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  6. #6
    Membre à l'essai
    Inscrit en
    Juillet 2010
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 13
    Points : 11
    Points
    11
    Par défaut
    Oula oui !

    Si je pouvais, je passerais toute l'appli en UTF-8 mais je développe simplement la partie client, je n'ai pas accès aux serveurs ni aux BDD.

    Mes fichiers sont encodés en ANSI (contrainte de l'environnement).
    J'utilise le charset ISO-8859-1 dans mes META.

    Il se trouve que j'utilise jQuery.ajax pour poster mon formulaire. Si je sérialise mon formulaire avec jQuery.fn.serialize, le résultat sera encodé en UTF-8 (car il utilise encodeURIComponent). J'ai donc développé mon propre jQuery.fn.serializeLatin() pour mes besoins.

    Si tu as une meilleure solution à proposer je suis preneur...

  7. #7
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 640
    Points : 66 669
    Points
    66 669
    Billets dans le blog
    1
    Par défaut
    Ben gère le charset partout
    coté client
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=iso-8859-1");
    coté serveur (php):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    header('Content-Type: text/html; charset=ISO-8859-15');
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  8. #8
    Membre à l'essai
    Inscrit en
    Juillet 2010
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 13
    Points : 11
    Points
    11
    Par défaut
    Merci,

    Il faut pourtant éviter de sérialiser un formulaire en UTF-8 si on souhaite le soumettre en ISO-8859-1 !

    D'où le contournement suivant :
    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
    18
    19
    20
    	// Equivalent de encodeURIComponent en ISO-8859
    	function escapeURIComponent(str) {  
    		return escape(str).replace(/\+/g, '%2B');
    	}
     
    	// Equivalent de $.param en ISO-8859
    	$.paramLatin = function( a ) {
    		var s = [];
     
    		$.each( a, function( i, kv ) {
    			s[ s.length ] = escapeURIComponent(kv.name) + "=" + escapeURIComponent(kv.value);
    		});
     
    		return s.join("&").replace(/%20/g, '+');
    	};
     
    	// Equivalent de $.fn.serialize en ISO-8859
    	$.fn.serialiserLatin = function() {
    		return $.paramLatin( this.serializeArray() );
    	};

  9. #9
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 640
    Points : 66 669
    Points
    66 669
    Billets dans le blog
    1
    Par défaut
    un simple escape ne suffirait pas si le header est correct ?
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  10. #10
    Membre à l'essai
    Inscrit en
    Juillet 2010
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 13
    Points : 11
    Points
    11
    Par défaut
    Pas si un input contient un caractère spécial comme "+" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    escape('='); // renvoie "%3D"
    escape('+'); // renvoie "+"
     
    escapeURIComponent('='); // renvoie "%3D"
    escapeURIComponent('+'); // renvoie "%2B"

  11. #11
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 640
    Points : 66 669
    Points
    66 669
    Billets dans le blog
    1
    Par défaut
    et coté serveur avec uriencode ... doit y avoir un decode dispo non ?
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  12. #12
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Points : 6 755
    Points
    6 755
    Par défaut
    Le « + » est codé pareil en UTF-8 et en ISO-8859-*, je comprends pas pourquoi tu as besoin de l'encoder
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  13. #13
    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 : 53
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Citation Envoyé par Watilin
    Le « + » est codé pareil en UTF-8 et en ISO-8859-*, je comprends pas pourquoi tu as besoin de l'encoder
    Parce que dans une URL, le "+" correspond à un espace
    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

  14. #14
    Membre à l'essai
    Inscrit en
    Juillet 2010
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 13
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par SpaceFrog Voir le message
    et coté serveur avec uriencode ... doit y avoir un decode dispo non ?
    Comme je l'ai dit précédemment, je n'ai pas la main sur la partie serveur (qui de plus n'est pas en PHP).

    Citation Envoyé par Watilin Voir le message
    Le « + » est codé pareil en UTF-8 et en ISO-8859-*, je comprends pas pourquoi tu as besoin de l'encoder
    Malheureusement le "+" n'est pas encodé par défaut car c'est un caractère spécial qui représente un espace, d'où mon fix :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    escape('+'); // renvoie "+"
    escapeURIComponent('+'); // renvoie "%2B"

Discussions similaires

  1. afficher caracteres spéciaux
    Par Mousk dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 15/03/2006, 13h28
  2. [XML] Probleme de caracteres spéciaux
    Par Azonec dans le forum XML/XSL et SOAP
    Réponses: 6
    Dernier message: 13/12/2005, 15h48
  3. remplacer les caracteres spéciaux
    Par roninou dans le forum Langage
    Réponses: 2
    Dernier message: 02/11/2005, 15h26
  4. Analyseur XML : extraction des caracteres spéciaux
    Par abdou.sahraoui dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 19/07/2005, 15h07
  5. [DB2] supprimer les caractere spéciaux
    Par guin dans le forum DB2
    Réponses: 1
    Dernier message: 17/01/2005, 16h34

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