Codificación de caracteres JSON

Mi aplicación web Java envía una solicitud AJAX que devuelve JSON de la siguiente manera:

{'value': 'aériennes'} 

Cuando ‘aériennes’ se muestra en la página web, aparece como ‘a riennes’, así que supongo que hay algún tipo de problema de encoding de caracteres. Los encabezados de respuesta AJAX incluyen

 Content-Type application/json 

que no parece incluir ninguna información de conjunto de caracteres. Supongo que esto debe cambiarse a algo así como

 Content-Type text/html; charset=iso-8859-1 (or charset=utf8) 

El lado del servidor de la aplicación es Spring MVC, y supongo que debe haber una manera de establecer el juego de caracteres predeterminado para cada respuesta.

Los síntomas indican que la cadena JSON que originalmente estaba en encoding UTF-8 se escribió en la respuesta HTTP utilizando la encoding ISO-8859-1 y se le ordenó al explorador web que la muestre como UTF-8. Si fue escrito usando UTF-8 y se muestra como ISO-8859-1, entonces usted habría visto aériennes . Si fue escrito y exhibido usando ISO-8859-1, entonces usted habría visto a�riennes .

Para solucionar el problema de que la cadena JSON se haya escrito incorrectamente como ISO-8859-1, debe configurar su webapp / Spring para usar UTF-8 como encoding de respuesta HTTP. Básicamente , debe hacer lo siguiente bajo las sábanas:

 response.setCharacterEncoding("UTF-8"); 

No cambie su encabezado de tipo de contenido. Está perfectamente bien para JSON y se muestra como UTF-8.

No sé si esto ya es relevante, pero lo arreglé con la anotación @RequestMapping.

 @RequestMapping(method=RequestMethod.GET, produces={"application/json; charset=UTF-8"}) 

En primer lugar, sus datos publicados no son JSON válidos. Esto sería:

 {"value": "aériennes"} 

Tenga en cuenta las comillas dobles: son obligatorios.

El tipo de contenido para datos JSON debe ser application/json . Los datos JSON reales (lo que tenemos arriba) deben codificarse usando UTF-8, UTF-16 o UTF-32. Yo recomendaría usar UTF-8.

Puede usar una herramienta como Wireshark para monitorear el tráfico de red y ver cómo se ve la información, debería ver los bytes c3 89 para el é. Nunca he trabajado con Spring, pero si está haciendo la encoding JSON, esto probablemente se solucione adecuadamente, para ti.

Una vez que el JSON llega al navegador, debería ser bueno, si es válido. Sin embargo, ¿cómo está insertando los datos de la respuesta JSON en la página web?

finalmente obtuve la solución:

Solo pon esta linea

 @RequestMapping(value = "/YOUR_URL_Name",method = RequestMethod.POST,produces = "application/json; charset=utf-8") 

esto definitivamente ayudará.

Eso me pasó exactamente lo mismo con esto:

 < %@ page language="java" contentType="application/json" pageEncoding="UTF-8"%> 

Pero esto funciona para mí:

 < %@ page language="java" contentType="application/json; charset=UTF-8" pageEncoding="UTF-8"%> 

Prueba agregar

  ;charset=UTF-8 

a su contentType.

 response.setContentType("application/json;charset=utf-8"); 

Las respuestas aquí me ayudaron a resolver mi problema, aunque no está completamente relacionado. Utilizo la API javax.ws.rs y las anotaciones @Produces y @Consumes y tuve el mismo problema: el JSON que estaba devolviendo en el servicio web no estaba en UTF-8. Lo resolví con las siguientes anotaciones sobre mis funciones de controlador:

 @Produces(javax.ws.rs.core.MediaType.APPLICATION_JSON + "; charset=UTF-8") 

y

 @Consumes(javax.ws.rs.core.MediaType.APPLICATION_JSON + "; charset=UTF-8") 

En la función get y post de cada punto final. No estaba configurando el juego de caracteres y esto lo resolvió. Esto es parte de la camiseta, así que tal vez deberás agregar una dependencia de maven.

Si está utilizando StringEntity intente esto , usando su elección de encoding de caracteres. Maneja caracteres extranjeros también.

Además, puede usar la anotación de spring RequestMapping arriba de la clase de controlador para recibir la aplicación / json; utf-8 en todas las respuestas

 @Controller @RequestMapping(produces = {"application/json; charset=UTF-8","*/*;charset=UTF-8"}) public class MyController{ ... }