2008-08-25 47 views
36

Dans mon application Web, je soumets certains champs de formulaire avec la méthode jQuery $.getJSON(). J'ai quelques problèmes avec l'encodage. Le jeu de caractères de mon application est charset=ISO-8859-1 mais je pense que ces champs sont soumis avec UTF-8.Comment définir l'encodage dans .getJSON JQuery

Est-ce que quelqu'un sait, comment je peux définir l'encodage dans $.getJSON appels?

+1

Selon [ce] (http://stackoverflow.com/a/13098683/95735) réponse i Il est illégal de spécifier charset pour 'application/json'. –

+1

** ILLEGAL? ** J'espère ne pas être arrêté pour avoir essayé ... – jbowman

Répondre

32

Je pense que vous aurez probablement à utiliser $.ajax() si vous voulez changer le codage, voir le contentType ci-dessous param (les success et error callbacks suppose que vous avez <div id="success"></div> et <div id="error"></div> dans le html):

$.ajax({ 
    type: "POST", 
    url: "SomePage.aspx/GetSomeObjects", 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    data: "{id: '" + someId + "'}", 
    success: function(json) { 
     $("#success").html("json.length=" + json.length); 
     itemAddCallback(json); 
    }, 
    error: function (xhr, textStatus, errorThrown) { 
     $("#error").html(xhr.responseText); 
    } 
}); 

En fait, je devais juste faire cela il y a environ une heure, quelle coïncidence!

+1

Je viens juste de comprendre que vous surchargez l'objet hôte XMLHttpRequest dans la méthode d'erreur. C'est juste une question de bonne pratique de codage pour ne pas confondre d'autres développeurs;) Je suggérerais de le renommer en quelque chose d'autre;) – Wilq32

+0

comment est le son 'xhr'? ;-) – travis

+0

Beaucoup mieux :) (en fait d'habitude je l'appelle le même que vous maintenant:>) – Wilq32

42

Si vous souhaitez utiliser $.getJSON() vous pouvez ajouter ce qui suit avant l'appel:

$.ajaxSetup({ 
    scriptCharset: "utf-8", 
    contentType: "application/json; charset=utf-8" 
}); 

Vous pouvez utiliser le charset que vous voulez au lieu de utf-8.

Les options sont expliquées here.

contentType : Lors de l'envoi de données au serveur, utilisez content-type. La valeur par défaut est application/x-www-form-urlencoded, ce qui est correct dans la plupart des cas.

scriptCharset : Uniquement pour les demandes avec jsonp ou script dataType et le type GET. Force la requête à être interprétée comme un certain jeu de caractères. Uniquement nécessaire pour les différences de charset entre le contenu distant et local.

Vous devrez peut-être un ou les deux ...

+3

hi Pat, j'ai le même problème de réglage du type de contenu avec la méthode getJSON.J'ai utilisé $ .ajaxSetup juste avant d'appeler getJSON, mais aucune modification ne se produit, les caractères "nordiques" deviennent des caractères indésirables dans ma base de données. pourriez-vous me dire l'ordre exact d'appeler mathods? thnx – Bhupi

+1

Selon [this] (http://stackoverflow.com/a/13098683/95735), il est illégal de spécifier charset pour 'application/json'. –

+0

J'ai eu un problème similaire avec post et j'utilisais l'appel $ .ajax (...) au lieu de $ .post (...) parce que je n'avais pas le moyen de changer le type de contenu. Cela me permet d'utiliser la notation $ .post abrégée pour correspondre au $ .get que j'utilise. Je crois que ceci devrait être la réponse acceptée parce que cela fonctionne et permet l'utilisation de $ .getJSON(). – eesh

1

Utilisation encodeURI() dans le client JS et utiliser URLDecoder.decode() dans les travaux côté serveur Java.


Exemple:

  • Javascript:

    $.getJSON(
        url, 
        { 
         "user": encodeURI(JSON.stringify(user)) 
        }, 
        onSuccess 
    ); 
    
  • Java:

    java.net.URLDecoder.decode(params.user, "UTF-8");

4

Vous devez analyser les JSON appels à l'aide Wireshark, vous verrez si vous incluez le jeu de caractères dans la formation de la page JSON ou non, par exemple:

  • Si la page est simple si text/html
 
0000 48 54 54 50 2f 31 2e 31 20 32 30 30 20 4f 4b 0d HTTP/1.1 200 OK. 
0010 0a 43 6f 6e 74 65 6e 74 2d 54 79 70 65 3a 20 74 .Content -Type: t 
0020 65 78 74 2f 68 74 6d 6c 0d 0a 43 61 63 68 65 2d ext/html ..Cache- 
0030 43 6f 6e 74 72 6f 6c 3a 20 6e 6f 2d 63 61 63 68 Control: no-cach 
  • Si la page est du type, y compris sur mesure JSON avec MIME "charset = ISO-8859-1"
 
0000 48 54 54 50 2f 31 2e 31 20 32 30 30 20 4f 4b 0d HTTP/1.1 200 OK. 
0010 0a 43 61 63 68 65 2d 43 6f 6e 74 72 6f 6c 3a 20 .Cache-C ontrol: 
0020 6e 6f 2d 63 61 63 68 65 0d 0a 43 6f 6e 74 65 6e no-cache ..Conten 
0030 74 2d 54 79 70 65 3a 20 74 65 78 74 2f 68 74 6d t-Type: text/htm 
0040 6c 3b 20 63 68 61 72 73 65 74 3d 49 53 4f 2d 38 l; chars et=ISO-8 
0050 38 35 39 2d 31 0d 0a 43 6f 6e 6e 65 63 74 69 6f 859-1..C onnectio 

Pourquoi est-ce? parce que nous ne pouvons pas mettre sur la page de JSON un but comme celui-ci:

Dans mon cas, j'utilise le fabricant Me connecter 9210 Digi:

  • je devais utiliser un drapeau pour indiquer que l'on pourrait utiliser MIME non standard: p-> theCgiPtr-> = fDataType eRpDataTypeOther;
  • Il a ajouté le nouveau MIME dans la variable: strcpy (p-> theCgiPtr-> fOtherMimeType, "text/html; charset = ISO-8859-1");

Il a travaillé pour moi sans avoir à convertir les données transmises par JSON pour UTF-8, puis refaire la conversion sur la page ...

0

Utilisez cette fonction pour récupérer les caractères utf-8

function decode_utf8(s) { 

    return decodeURIComponent(escape(s)); 

} 

exemple:

var new_Str=decode_utf8(str);