2008-08-25 11 views
36

En mi aplicación web, envío algunos campos de formulario con el método jQuery $.getJSON(). Estoy teniendo algunos problemas con la codificación. El conjunto de caracteres de mi aplicación es charset=ISO-8859-1, pero creo que estos campos se envían con UTF-8.Cómo establecer la codificación en .getJSON JQuery

¿Alguien sabe cómo puedo configurar la codificación en llamadas $.getJSON?

+1

Según [esta] respuesta (http://stackoverflow.com/a/13098683/95735) i Es ilegal especificar un juego de caracteres para 'application/json'. –

+1

** ILEGAL? ** Espero no ser arrestado por intentar ... – jbowman

Respuesta

32

creo que es probable que tenga que utilizar $.ajax() si desea cambiar la codificación, ver el parámetro contentType a continuación (los successerror y devoluciones de llamada se supone que tiene <div id="success"></div> y <div id="error"></div> en el 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); 
    } 
}); 

De hecho, tuve que hacer esto hace una hora, ¡qué casualidad!

+1

Acabo de descifrar que el objeto host XMLHttpRequest está dentro del método de error. Es solo cuestión de una buena práctica de codificación para no confundir a otros desarrolladores;) Sugeriría cambiarle el nombre a algo más;) – Wilq32

+0

¿Cómo está el sonido 'xhr'? ;-) – travis

+0

Mucho mejor :) (de hecho, normalmente lo llamo igual a ti ahora:>) – Wilq32

42

Si desea utilizar $.getJSON() puede agregar lo siguiente antes de la llamada:

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

Se puede utilizar el juego de caracteres que desea en lugar de utf-8.

Las opciones se explican here.

contentType : Al enviar datos al servidor, utilice este content-type. El valor predeterminado es application/x-www-form-urlencoded, lo cual está bien para la mayoría de los casos.

scriptCharset : Solo para solicitudes con jsonp o script dataType y GET type. Obliga a la solicitud a interpretarse como un cierto conjunto de caracteres. Solo es necesario para las diferencias de caracteres entre el contenido remoto y el local.

Usted puede necesitar uno o ambos ...

+3

hola Pat, estoy teniendo el mismo problema de establecer el tipo de contenido con el método getJSON.Usé $ .ajaxSetup justo antes de llamar a getJSON, pero no ocurre ningún cambio, los caracteres "nórdicos" se convierten en caracteres no deseados en mi base de datos. ¿Podrían por favor decirme el orden exacto de llamar a Mathods? thnx – Bhupi

+1

Según [this] (http://stackoverflow.com/a/13098683/95735) la respuesta es ilegal especificar un juego de caracteres para 'application/json'. –

+0

Tuve un problema similar con la publicación y estaba usando la llamada $ .ajax (...) en lugar de $ .post (...) porque no tenía forma de cambiar el tipo de contenido. Esto me permite usar la notación abreviada $ .post para que coincida con $ .get que estoy usando. Creo que esta debería ser la respuesta aceptada porque funciona y permite el uso de $ .getJSON(). – eesh

1

Uso encodeURI() en el cliente y el uso de JS URLDecoder.decode() en trabajos secundarios de Java del servidor.


Ejemplo:

  • Javascript:

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

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

4

Es necesario analizar el JSON llamadas con Wireshark, por lo que verá si se incluye el conjunto de caracteres en la formación de la página JSON o no, por ejemplo:

  • Si la página es 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 página es del tipo que incluye encargo JSON con 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 

¿Por qué es eso? porque no se puede poner en la página de JSON un objetivo como este:

En mi caso utilizo el fabricante en Conectarme 9210 Digi:

  • tuve que usar una bandera para indicar que se podría usar MIME no estándar: p-> theCgiPtr-> = fDataType eRpDataTypeOther;
  • Agregó el nuevo MIME en la variable: strcpy (p-> theCgiPtr-> fOtherMimeType, "text/html; charset = ISO-8859-1");

Funcionó para mí sin tener que convertir los datos pasados ​​por JSON para UTF-8 y vuelva a realizar la conversión en la página ...

0

Utilice esta función para recuperar los caracteres UTF-8

function decode_utf8(s) { 

    return decodeURIComponent(escape(s)); 

} 

ejemplo:

var new_Str=decode_utf8(str); 
Cuestiones relacionadas