2010-10-22 28 views
50
aplicación web Java

Mi somete una petición AJAX que devuelve JSON como:JSON codificación de caracteres

{'value': 'aériennes'} 

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

Content-Type application/json 

que no parece incluir ninguna información de conjunto de caracteres. Creo que esto tiene que ser cambiado 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 configurar el juego de caracteres por defecto para cada respuesta?

Respuesta

14

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 should beapplication/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 utilizar una herramienta como Wireshark para supervisar el tráfico de red y ver cómo se ve la información, debe ver los bytes c3 89 para é. Nunca he trabajado con Spring, pero si está haciendo la codificación JSON, esto probablemente se solucione adecuadamente, para ti.

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

52

Los síntomas indican que la cadena JSON que originalmente estaba en codificación UTF-8 se escribió en la respuesta HTTP utilizando la codificación 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 habría visto aériennes. Si fue escrito y visualizados usando ISO-8859-1, entonces 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 codificación de respuesta HTTP. Básicamente, hay que hacer lo siguiente bajo las sábanas:

response.setCharacterEncoding("UTF-8"); 

no cambia su cabecera de tipo de contenido. Está perfectamente bien para JSON y se muestra como UTF-8.

4

que 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"%> 

Trate de añadir

;charset=UTF-8 

a su contentType.

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

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"}) 
+0

Gracias Lars Juel Jensen! Tu respuesta resolvió mi problema de esta publicación http://stackoverflow.com/questions/29865056/jquery-datatables-does-not-show-unicode-characters –

0

Si está utilizando StringEntity tratar this, usando su opción de codificación de caracteres. Maneja caracteres extranjeros también.

6

finalmente conseguí la solución:

Sólo coloque esta línea

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

esto definitivamente va a ayudar.

0

Además, se puede usar un muelle de anotación RequestMapping por encima de clase controlador para receveing ​​application/json; UTF-8 en todas las respuestas

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

Si las soluciones sugeridas anteriormente no ha solucionado el problema (en cuanto a mí), esto también podría ayudar:

Mi problema era que estaba devolviendo una cadena json en mi respuesta utilizando Springs @ResponseBody. Si estás haciendo esto también, esto podría ayudar.

Agregue el siguiente bean a su servlet despachador.

<bean 
    class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> 
    <property name="messageConverters"> 
     <list> 
      <bean 
       class="org.springframework.http.converter.StringHttpMessageConverter"> 
       <property name="supportedMediaTypes"> 
        <list> 
         <value>text/plain;charset=UTF-8</value> 
        </list> 
       </property> 
      </bean> 
     </list> 
    </property> 
</bean> 

(que se encuentra aquí: http://forum.spring.io/forum/spring-projects/web/74209-responsebody-and-utf-8)

1

Las respuestas aquí ayudó a resolver mi problema, aunque no está completamente relacionada. Utilizo la API de 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 resuelto con las siguientes anotaciones en la parte superior de 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 función get y post de todos los parámetros. 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.

Cuestiones relacionadas