JSON character encoding
mon application Java Web soumet une requête AJAX qui renvoie JSON tel:
{'value': 'aériennes'}
quand "aériennes" est affiché dans la page web, il apparaît comme "a ante riennes", donc je suppose qu'il y a une sorte de problème d'encodage des caractères. Les en-têtes de réponse AJAX comprennent
Content-Type application/json
qui ne semble pas inclure d'information sur le jeu de caractères. Je suppose que cela doit être changé en quelque chose comme
Content-Type text/html; charset=iso-8859-1 (or charset=utf8)
le côté serveur de l'application est MVC printemps, et je suppose qu'il doit y avoir un moyen de définir le jeu de caractères par défaut pour chaque réponse?
10 réponses
les symptômes indiquent que la chaîne JSON qui était à l'origine dans L'encodage UTF-8 a été écrite à la réponse HTTP en utilisant L'encodage ISO-8859-1 et le webbrowser a été chargé de l'afficher comme UTF-8. S'il était écrit en UTF-8 et affiché comme ISO-8859-1, alors vous auriez vu aériennes
. S'il était écrit et affiché en utilisant ISO-8859-1, alors vous auriez vu a�riennes
.
pour résoudre le problème de la chaîne JSON incorrectement écrit comme ISO-8859-1, vous devez configurer votre webapp / Spring pour utiliser UTF-8 comme encodage de réponse HTTP. essentiellement , il devrait faire ce qui suit sous les couvertures:
response.setCharacterEncoding("UTF-8");
ne changez pas l'en-tête de votre type de contenu. Il est parfaitement bien pour JSON et il est affiché en UTF-8.
Je ne sais pas si cela est encore pertinent, mais je l'ai corrigé avec l'annotation @RequestMapping.
@RequestMapping(method=RequestMethod.GET, produces={"application/json; charset=UTF-8"})
premièrement, vos données postées ne sont pas valides JSON. Ce serait:
{"value": "aériennes"}
notez les doubles guillemets: ils sont obligatoires.
le type de contenu pour les données JSON devrait être application/json
. Les données JSON actuelles (ce que nous avons ci-dessus) devraient être encodées en UTF-8, UTF-16, ou UTF - 32-je recommande L'utilisation UTF-8.
vous pouvez utiliser un outil comme Wireshark pour surveiller le trafic réseau et voir comment les données ressemble, vous devriez voir les octets c3 89
pour l'é. Je n'ai jamais travaillé avec Spring, mais s'il fait l'encodage JSON, c'est probablement pris en charge correctement, pour vous.
une fois que le JSON atteint le navigateur, il devrait être bon, si elle est valide. Cependant, comment insérez-vous les données de la réponse JSON dans la page web?
finalement j'ai eu la solution:
mettez seulement cette ligne
@RequestMapping(value = "/YOUR_URL_Name",method = RequestMethod.POST,produces = "application/json; charset=utf-8")
cela va certainement aider.
qui m'est arrivé exactement le même avec ceci:
<%@ page language="java" contentType="application/json" pageEncoding="UTF-8"%>
mais ça marche pour moi:
<%@ page language="java" contentType="application/json; charset=UTF-8" pageEncoding="UTF-8"%>
essayez d'ajouter
;charset=UTF-8
à votre contentType.
les réponses ici m'ont aidé à résoudre mon problème, même s'il n'est pas complètement relié. J'utilise le javax.ws.rs API et les annotations @Produces et @Consumes et avait ce même problème - le JSON que je retournais dans le service web n'était pas en UTF-8. Je l'ai résolu avec les annotations suivantes en plus de mes fonctions de contrôleur:
@Produces(javax.ws.rs.core.MediaType.APPLICATION_JSON + "; charset=UTF-8")
et
@Consumes(javax.ws.rs.core.MediaType.APPLICATION_JSON + "; charset=UTF-8")
sur toutes les fonctions get et post. Je n'étais pas le réglage du jeu de caractères et cela a résolu. C'est une partie de jersey donc peut-être que vous devrez ajouter une dépendance maven.
aussi, vous pouvez utiliser l'annotation de ressort RequestMapping classe de contrôleur ci-dessus pour recevoir application/json; utf-8 dans toutes les réponses
@Controller
@RequestMapping(produces = {"application/json; charset=UTF-8","*/*;charset=UTF-8"})
public class MyController{
...
}
si les solutions suggérées ci-dessus ne résolvaient pas votre problème (comme pour moi), cela pourrait aussi aider:
mon problème était que je retournais une chaîne json dans ma réponse en utilisant des ressorts @ResponseBody
. Si vous le faites aussi, ça pourrait aider.
ajouter le haricot suivant à votre servlet de répartiteur.
<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>
(trouvé ici: http://forum.spring.io/forum/spring-projects/web/74209-responsebody-and-utf-8 )