it-swarm.dev

JQuery AJAX não está enviando UTF-8 para o meu servidor, apenas em IE

Estou enviando UTF-8, texto em japonês, para o meu servidor. Funciona no Firefox. Meu access.log e cabeçalhos são:

/ajax/?q=%E6%BC%A2%E5%AD%97
Accept-Charset  ISO-8859-1,utf-8;q=0.7,*;q=0.7
Content-Type    application/x-www-form-urlencoded; charset=UTF-8

Howeer, no IE8, meu access.log diz:

/ajax/?q=??

Por alguma razão, o IE8 está transformando minha chamada AJAX em pontos de interrogação. Por quê!? Eu adicionei o scriptCharset e ContentType de acordo com alguns tutoriais, mas ainda sem sorte.

E esse é o meu código:

$.ajax({
    method:"get",
    url:"/ajax/",
    scriptCharset: "utf-8" ,
    contentType: "application/x-www-form-urlencoded; charset=UTF-8",
    data:"q="+query ...,
    ...
    })
24
TIMEX

Tente codificar o parâmetro de consulta com encodeURIComponent()

data:"q="+encodeURIComponent( query )

como bobince observou muito corretamente em seu comentário, se você usar a notação de objeto para passar parâmetros para o método ajax, ele irá manipular a própria codificação.

assim 

data:{ q : query }

fará o jQuery manipular a codificação.

55
Gabriele Petrioli

Eu li este post esperando que isso resolvesse o problema que eu havia encontrado e que tivesse a ver com as conversões do utf8.

No meu caso, descobriu-se que o mecanismo do servidor (node.js), calculando o comprimento de conteúdo dos dados com os dados considerados brutos e não utf8, assim caracteres estendidos de dois caracteres no uft8 foi calculado como se eles fossem um caractere resultante no servidor enviando um caractere muito pouco.

Veja o que eu fiz para resolvê-lo aqui: Não bem formado Json ao enviar para o CouchDB

2
javabeangrinder

Eu sei que este é um post antigo, mas eu tive esse problema recentemente e gostaria de contribuir apenas no caso de alguém ter o mesmo problema. Estou usando PHP mas estou Certifique-se de que há uma opção em cada idioma do lado do servidor. Foi apenas um par de coisas:

  1. Certifique-se de que está enviando os cabeçalhos certos para sua resposta do ajax adicionando o cabeçalho ('Content-Type: text/html; charset = utf-8'); Esta deve ser sua primeira linha. Se você tem algum erro dizendo que os cabeçalhos já foram enviados ou algo assim é porque em algum lugar no seu código você está produzindo um espaço extra ou algo assim antes de enviar o cabeçalho para verificar seu código.

  2. Quando você construir sua resposta em seu servidor, certifique-se de converter todos os seus caracteres no char HTML correspondente usando echo htmlentities ($ your-string, null, 'utf-8); Porque mesmo depois de informar IE que você está enviando dados utf-8, parece que IE esquece isso ou simplesmente não assume nada, então adicionar isso ao seu código garantirá o direito saída.

Obrigado a todos por sua ajuda.

1
Alfonso

Use encodeURIComponent() em javaScript. Aqui está o exemplo:

function doPost()
{
    var URL = "http://localhost/check.php?yab=" + encodeURIComponent(document.getElementById("formSearch").childNodes[1].value);
    xmlHttp.open("GET", URL);
    xmlHttp.send();
};
0
ali.b.y