2010-03-18 19 views
23

Estoy enviando UTF-8, texto en japonés, a mi servidor. Funciona en Firefox. Mi access.log y las cabeceras son:JQuery AJAX no está enviando UTF-8 a mi servidor, solo en IE

/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, en IE8, mi access.log dice:

/ajax/?q=?? 

Por alguna razón, IE8 está convirtiendo mi AJAX pone en signos de interrogación. ¿¡Por qué!? Agregué el scriptCharset y ContentType de acuerdo con algunos tutoriales, pero todavía no tuve suerte.

Y este es mi código:

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

es la página que inicia la llamada también codificada en utf-8 (con el juego de caracteres correcto definido)? –

+0

Sí, está META TAG: . Además, accept-charset está en el formulario. – TIMEX

+0

¿La página está realmente guardada en formato UTF-8? Hubo una pregunta con un problema similar el otro día que especificaba el juego de caracteres UTF-8 en el archivo, pero el archivo se guardó como ANSI. –

Respuesta

53

Trate codifica el parámetro de consulta con encodeURIComponent()

data:"q="+encodeURIComponent(query) 

como bobince observó muy bien en su comentario, si se utiliza la notación de objetos para pasar parámetros a el método ajax manejará la codificación en sí ...

so

data:{ q : query } 

hará jQuery manejar la codificación ..

+0

+1 Esto fue lo primero que pensé, pero pensé que jQuery manejaba la codificación. Ahora, en realidad, tiene sentido que jQuery no maneje la codificación si los datos ya estaban configurados en una cadena de consulta. Duh! –

+0

@Andy, tuve los mismos pensamientos al principio, pero luego noté el código real ... :) –

+3

Sí, esta es una buena razón para pasar un mapeo como '{q: query}' a 'ajax()' y dejar jQuery se preocupa por la codificación para usted. – bobince

0

Sé que esto es una entrada antigua, pero tuve este problema hace poco y me gustaría contribuir por si acaso alguien tiene el mismo problema. Estoy usando PHP, pero estoy seguro de que hay una opción en cada idioma del servidor. Fue sólo un par de cosas:

  1. Asegúrese de que está enviando las cabeceras correctas en su respuesta ajax añadiendo header ('Content-Type: text/html; charset = UTF-8'); Esta debe ser tu primera línea. Si tiene algún error que diga que los encabezados ya se han enviado o algo así es porque en algún lugar de su código está produciendo un espacio adicional o algo así antes de enviar el encabezado, así que verifique su código.

  2. Cuando construye su respuesta en su servidor, asegúrese de convertir todos sus caracteres al carácter HTML correspondiente utilizando echo htmlentities ($ su-cadena, nulo, 'utf-8); Porque incluso después de decirle a IE que está enviando datos de utf-8, parece que IE lo olvida o simplemente no asume nada, por lo que agregar esto a su código asegurará el resultado correcto.

Gracias por su ayuda.

2

He leído esta publicación esperando que resuelva el problema que he encontrado y que tiene que ver con las conversiones de utf8.

En mi caso, resultó que el motor del servidor (node.js) calculaba la longitud del contenido de los datos con los datos considerados brutos y no utf8, por lo tanto, se calculó el carácter extendido de dos caracteres en uft8 como si donde una char resulta en que el servidor envía un carácter muy poco.

vean lo que hice para resolverlo aquí: Not well formed Json when sending to CouchDB

0

Uso encodeURIComponent() en JavaScript.Aquí está la muestra:

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