Pregunta

En mi aplicación web, envío algunos campos de formulario con jQuery $.getJSON() método.Tengo 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 puedo configurar la codificación utilizada en $.getJSON llamadas?

¿Fue útil?

Solución

Creo que probablemente tendrás que usar $.ajax() Si desea cambiar la codificación, consulte la contentType parámetro a continuación (el success y error las devoluciones de llamada asumen que tienes <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 aproximadamente una hora, ¡qué coincidencia!

Otros consejos

Si quieres usar $.getJSON() Puedes agregar lo siguiente antes de la llamada:

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

Puedes usar el juego de caracteres que quieras en lugar de utf-8.

Se explican las opciones. aquí.

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 : Sólo para solicitudes con jsonp o script tipo de datos y tipo GET.Obliga a que la solicitud se interprete como un determinado juego de caracteres.Solo es necesario para las diferencias de conjuntos de caracteres entre el contenido local y remoto.

Quizás necesites uno o ambos...

Necesitas analizar las llamadas JSON usando Wireshark, así verás si incluyes el juego de caracteres en la formación de la página JSON o no, por ejemplo:

  • Si la pagina es simple si texto/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 JSON personalizado 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

¿Porqué es eso?porque no podemos poner en la página de JSON un objetivo como este:

En mi caso utilizo el fabricante Connect Me 9210 Digi:

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

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

Usar encodeURI() en el cliente JS y uso URLDecoder.decode() en el lado del servidor Java funciona.


Ejemplo:

  • JavaScript:

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

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

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);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top