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?

54
demandé sur Dónal 2010-10-22 13:35:18

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.

53
répondu BalusC 2010-10-24 15:39:05

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"})
30
répondu Lars Juel Jensen 2013-03-12 17:47:30

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?

15
répondu Thanatos 2010-10-22 20:51:12

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.

7
répondu AbdulHayee 2017-08-06 23:55:48

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.

5
répondu Jorge Carretero 2011-03-09 17:23:13
response.setContentType("application/json;charset=utf-8");
3
répondu ton 2013-10-10 15:35:45

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.

1
répondu Alexandre Pimentel 2017-05-08 02:53:38

si vous utilisez StringEntity essayez ce , en utilisant votre choix d'encodage de caractères. Il gère les caractères étrangers.

0
répondu craned 2017-05-23 11:55:10

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{
 ...
}
0
répondu Yuri Gavrysh 2015-08-04 09:55:27

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 )

0
répondu Erando 2015-11-02 09:59:20