Cómo configurar la codificación en .getJSON jQuery
-
09-06-2019 - |
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?
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);