Como definir a codificação em .getJSON jQuery
-
09-06-2019 - |
Pergunta
No meu aplicativo da web, envio alguns campos de formulário com jQuery $.getJSON()
método.Estou tendo alguns problemas com a codificação.O conjunto de caracteres do meu aplicativo é charset=ISO-8859-1
, mas acho que esses campos são enviados com UTF-8
.
Como posso definir a codificação usada em $.getJSON
chamadas?
Solução
Eu acho que você provavelmente terá que usar $.ajax()
se você quiser alterar a codificação, consulte o contentType
parâmetro abaixo (o success
e error
retornos de chamada assumem que você tem <div id="success"></div>
e <div id="error"></div>
no 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);
}
});
Na verdade, tive que fazer isso há cerca de uma hora, que coincidência!
Outras dicas
Se você quiser usar $.getJSON()
você pode adicionar o seguinte antes da chamada:
$.ajaxSetup({
scriptCharset: "utf-8",
contentType: "application/json; charset=utf-8"
});
Você pode usar o conjunto de caracteres desejado em vez de utf-8
.
As opções são explicadas aqui.
contentType :
Ao enviar dados para o servidor, use este content-type
.O padrão é application/x-www-form-urlencoded
, o que é bom para a maioria dos casos.
scriptCharset :
Somente para solicitações com jsonp
ou script
tipo de dados e tipo GET.Força a interpretação da solicitação como um determinado conjunto de caracteres.Necessário apenas para diferenças de conjunto de caracteres entre o conteúdo remoto e local.
Você pode precisar de um ou de ambos...
Você precisa analisar as chamadas JSON usando o Wireshark, assim você verá se inclui o charset na formação da página JSON ou não, por exemplo:
- Se a página for simples se 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
- Se a página for do tipo que inclui JSON personalizado com 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 que é que?pois não podemos colocar na página do JSON um objetivo como esse:
No meu caso utilizo o fabricante Connect Me 9210 Digi:
- Tive que usar um sinalizador para indicar que seria usado MIME não padrão:p-> theCgiPtr-> = fDataType eRpDataTypeOther;
- Adicionou o novo MIME na variável:strcpy (p-> theCgiPtr-> fOtherMimeType, "text/html;conjunto de caracteres=ISO-8859-1");
Funcionou para mim sem precisar converter os dados passados por JSON para UTF-8 e depois refazer a conversão na página...
Usar encodeURI()
no cliente JS e use URLDecoder.decode()
no servidor Java funciona.
Exemplo:
JavaScript:
$.getJSON( url, { "user": encodeURI(JSON.stringify(user)) }, onSuccess );
Java:
java.net.URLDecoder.decode(params.user, "UTF-8");
Use esta função para recuperar os caracteres utf-8
function decode_utf8(s) {
return decodeURIComponent(escape(s));
}
exemplo:
var new_Str=decode_utf8(str);