web-dev-qa-db-fra.com

Encodage de caractères JSON

Mon Java Web soumet une demande AJAX qui renvoie un fichier JSON tel que:

{'value': 'aériennes'}

Lorsque "aériennes" est affiché sur la page Web, il apparaît comme "a�riennes". Je suppose donc qu'il existe un problème d'encodage des caractères. Les en-têtes de réponse AJAX incluent

Content-Type    application/json

qui ne semble inclure aucune information de jeu de caractères. Je suppose que cela doit être changé pour quelque chose comme

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

Le côté serveur de l'application est Spring MVC, et j'imagine qu'il doit y avoir un moyen de définir le jeu de caractères par défaut pour chaque réponse?

55
Dónal

Les symptômes indiquent que la chaîne JSON qui était à l'origine au codage UTF-8 a été écrite dans la réponse HTTP à l'aide du codage ISO-8859-1 et que le navigateur Web a été invité à l'afficher au format UTF-8. S'il avait été écrit avec UTF-8 et affiché comme ISO-8859-1, alors vous auriez vu aériennes. Si elle était écrite et affichée avec ISO-8859-1, vous auriez vu a�riennes.

Pour résoudre le problème de la chaîne JSON incorrectement écrite en tant que ISO-8859-1, vous devez configurer votre application Web/Spring afin qu'elle utilise UTF-8 comme codage de réponse HTTP. Fondamentalement, 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. C'est parfaitement correct pour JSON et il est affiché en UTF-8.

54
BalusC

Je ne sais plus si c'est pertinent, mais je l'ai corrigé avec l'annotation @RequestMapping.

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

Premièrement, vos données publiées ne sont pas un JSON valide. Ce serait:

{"value": "aériennes"}

Notez les guillemets doubles: ils sont obligatoires.

Le type de contenu pour les données JSON devrait êtreapplication/json. Les données JSON réelles (ce que nous avons ci-dessus) devraient être codées avec UTF-8, UTF-16 ou UTF-32 - Je vous recommande d'utiliser UTF-8.

Vous pouvez utiliser un outil tel que Wireshark pour surveiller le trafic réseau et voir à quoi ressemblent les données. Vous devriez voir les octets c3 89 pour le é. Je n'ai jamais travaillé avec Spring, mais si c'est l'encodage JSON, c'est probablement pris en charge correctement, pour vous.

Une fois que le JSON a atteint le navigateur, il devrait être bon, s'il est valide. Cependant, comment insérez-vous les données de la réponse JSON dans la page Web?

15
Thanatos

enfin j'ai eu la solution:

Seulement mettre cette ligne

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

cela aidera certainement.

8
AbdulHayee

Cela m'est arrivé exactement la même chose avec ceci:

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

Mais cela fonctionne pour moi:

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

Essayez d'ajouter

 ;charset=UTF-8

à votre contentType.

5
Jorge Carretero
response.setContentType("application/json;charset=utf-8");
3
ton

Les réponses ici m'ont aidé à résoudre mon problème, bien que ce ne soit pas complètement lié. J'utilise l'API javax.ws.rs et les annotations @Produces et @Consumes et j'ai le même problème: le JSON que je renvoyais dans le service Web ne se trouvait pas dans UTF-8. Je l'ai résolu avec les annotations suivantes au-dessus des fonctions de mon 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 chaque extrémité, les fonctions get et post. Je ne mettais pas le jeu de caractères et cela l'a résolu. Cela fait partie du maillot alors vous devrez peut-être ajouter une dépendance maven.

1
Alexandre Pimentel

Si vous utilisez StringEntity try this , utilisez votre choix de codage de caractères. Il gère également les caractères étrangers.

0
craned

Si les solutions proposées ci-dessus ne résolvent pas votre problème (comme pour moi), cela pourrait également aider:

Mon problème était que je retournais une chaîne JSON dans ma réponse en utilisant Springs @ResponseBody. Si vous faites cela aussi, cela pourrait aider.

Ajoutez le bean 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
Erando

De plus, vous pouvez utiliser une annotation à ressort RequestMapping au-dessus de la classe du contrôleur pour la réception application/json; utf-8 dans toutes les réponses.

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