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 :

Conversion d'encodage en javascript?


Sujet :

JavaScript

  1. #1
    Invité
    Invité(e)
    Par défaut Conversion d'encodage en javascript?
    Bonjour,

    J'ai repris le développement d'un site en JSP (qui n'est pas mon langage préféré.... oh non....) et j'ai des problèmes avec AJAX.

    J'ai une requête AJAX et il me retourne un String en UTF-8 mais mon site est en ISO-8859-1.

    Comment convertir l'encodage de ma chaine de caractères?

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 319
    Points : 351
    Points
    351
    Par défaut
    Salut !

    Alors, pour commencer, si ce n'est pas impératif de bosser en ISO-8859-1(5), travaille en UTF-8, ça devrait être plus fiable !

    Maintenant, vérifie que :

    - ton serveur HTTP soit bien configuré pour ce qui est des MIME-types / charset (normalement c'est correct, sauf si tu as l'a tripatouillé);
    - ton service JSP fixe l'entête HTTP qu'il te faut (si c'est ISO-8859-1(5) alors soit);
    - les chaînes que tu envoies soient véritablement encodées en... ah ! ISO-8859-1(5) ? Ah bah non, c'est de l'UTF-8 par défaut... ^^'

    Java et JavaScript utilisent UTF-8 par défaut si je ne m'abuse. Donc si tu tiens à utiliser un autre encodage alors il faut le faire à chaque communication... Bref !

    Pour décoder / encoder des chaînes du côté JavaScript tu peux te servir de ces fonctions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function encodeUTF8(string) {
      return unescape(encodeURIComponent(string));
    }
     
    function decodeUTF8(string) {
      return decodeURIComponent(escape(string));
    }
    Je te laisse consulter leurs documentations respectives si tu as besoin de plus de détails (c'est intéressant de comprendre ce qu'elles font).

    Finalement, tu devrais simplement pouvoir faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    taChaîne = decodeUTF8(taChaîne);

  3. #3
    Invité
    Invité(e)
    Par défaut
    @Oscar Hiboux: Merci pour ta solution. J'essais de la mettre en oeuvre mais j'ai une erreur :

    malformed URI sequence
    Je ne comprends pas pourquoi. Ma syntaxe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select_sous_cat = decodeUTF8(xhr.responseText);
    Qu'est-ce que l'URI ?

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 319
    Points : 351
    Points
    351
    Par défaut
    Hmm, on dirait que le contenu de la réponse est biscornu. As-tu la possibilité de l'afficher ici ?

    URI c'est Unified Resource Identifier. C'est très proche d'URL, mais... en différent ! Je te laisse lire la page liée au dessus, c'est bien expliqué.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Oscar Hiboux Voir le message
    Hmm, on dirait que le contenu de la réponse est biscornu. As-tu la possibilité de l'afficher ici ?

    URI c'est Unified Resource Identifier. C'est très proche d'URL, mais... en différent ! Je te laisse lire la page liée au dessus, c'est bien expliqué.
    Voilà la réponse :














    <select name='sous_cat' id='id_sous_cat' onChange='javascript:refresh_sousSousCat(1);' style='width
    :100%;display:block;'><option value=''>-- Sous-catégorie --</option><option value='243'>Moniteurs</option
    ><option value='247'>Enregistrement</option><option value='300'>Caméras</option><option value='307'>Accessoires
    </option><option value='328'>Solutions réseaux</option><option value='464'>Portiers Vidéo</option></select
    >
    A part les retour à la ligne bizarres je ne vois pas de problème

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 319
    Points : 351
    Points
    351
    Par défaut
    Hmm, étrange. J'ai du mal à cerner ton problème et surtout assez peu de temps, ne le cachons pas !.. ^^'

    Essaye avec ces petites méthodes que j'utilise pour mes affaires. Je les avais écrites dans le temps, ne connaissant pas encode/decodeURIComponent et finalement c'est ça que j'utilise quand j'en ai besoin. C'est plus verbeux à inclure dans ta bibliothèque de code mais au mode c'est platform agnostic (implémentation indépendante).

    Bien entendu, si tu n'utilises pas prototype.js il faudra sans doute adapter une ou deux bricoles, mais rien de grave, pas de panique !

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
     
    Object.extend(String.prototype, {
        encode: function(encoding) {
            encoding = encoding || "UTF-8";
     
            var result = "";
     
            if(encoding == "UTF-8") {
                var string = this.replace(/\r\n/g, "\n");
     
                for(var index = 0; index < string.length; index++) {
                    var c = string.charCodeAt(index);
     
                    if(c < 128) {
                        result += String.fromCharCode(c);
                    }
                    else if((c > 127) && (c < 2048)) {
                        result += String.fromCharCode((c >> 6) | 192);
                        result += String.fromCharCode((c & 63) | 128);
                    }
                    else {
                        result += String.fromCharCode((c >> 12) | 224);
                        result += String.fromCharCode(((c >> 6) & 63) | 128);
                        result += String.fromCharCode((c & 63) | 128);
                    }
                }
            }
            else {
                throw new Error("Unknown encoding: \"" + encoding + "\"");
            }
     
            return result;
        },
     
        decode: function(encoding) {
            encoding = encoding || "UTF-8";
     
            var result = "";
     
            if(encoding == "UTF-8") {
                var index = 0;
                var c = c1 = c2 = 0;
     
                while(index < this.length) {
                    c = this.charCodeAt(index);
     
                    if(c < 128) {
                        result += String.fromCharCode(c);
                        index++;
                    }
                    else if((c > 191) && (c < 224)) {
                        c2 = this.charCodeAt(index + 1);
                        result += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
                        index += 2;
                    }
                    else {
                        c2 = this.charCodeAt(index + 1);
                        c3 = this.charCodeAt(index + 2);
                        result += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
                        index += 3;
                    }
                }
            }
            else {
                throw new Error("Unknown encoding: \"" + encoding + "\"");
            }
     
            return result;
        }
    });
    Tel quel, tu l'utiliserais ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    "J'aime le café et la spéléologie.".encode();
    "À l'école, je n'aimais pas la géographie.".decode();
    (ou pas loin : l'éditeur du forum affiche mal les caractères tordus, ahahah ! )

  7. #7
    Membre émérite
    Inscrit en
    Septembre 2002
    Messages
    2 307
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 2 307
    Points : 2 814
    Points
    2 814
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <%@ page contentType="text/xml; charset=UTF-8" %>
    response.setContentType("text/html; charset=UTF-8");
    ne marche pas?

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 319
    Points : 351
    Points
    351
    Par défaut
    Le header est une chose, mais il faut être bien sûr que le contenu véhiculé soit en accord avec lui. D'où ma petite énumération plus haut ! ^^

Discussions similaires

  1. Conversion d'un code javascript en php
    Par jazz3210 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 07/02/2009, 20h48
  2. Conversion d"un code javascript en php
    Par jazz3210 dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 07/02/2009, 20h05
  3. Fonctions d'encodage en javascript
    Par csseur22 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 21/01/2008, 19h47
  4. [JavaScript] [SRC] Conversion de @Explode en JavaScript
    Par Stéphane Maillard dans le forum Contribuez
    Réponses: 0
    Dernier message: 10/08/2007, 03h21
  5. Pb encodage avec javascript et JSP
    Par marti dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 21/12/2005, 10h06

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