2010-10-22 6 views
50

Meine Java-Web-Anwendung sendet eine AJAX-Anforderung, die JSON so zurückgibt:JSON-Zeichencodierung

{'value': 'aériennes'} 

Wenn ‚aériennes‘ auf der Webseite angezeigt wird, erscheint es als ‚ariennes‘, so dass ich denke, es gibt einige ist Art von Zeichencodierungsproblem. Die AJAX-Antwortheader enthalten

, die anscheinend keine Zeichensatzinformationen enthält. Ich denke, das etwas geändert werden muss wie

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

Die Server-Seite des App ist Spring MVC, und ich denke, es muss ein Weg sein, um den Standard-Zeichensatz für jede Antwort zu setzen?

Antwort

14

Zuerst sind Ihre geposteten Daten kein gültiger JSON. Dies wäre:

{"value": "aériennes"} 

Beachten Sie die Anführungszeichen: Sie sind erforderlich.

Der Inhaltstyp für JSON-Daten should beapplication/json. Die eigentlichen JSON-Daten (was wir oben haben) sollten mit UTF-8, UTF-16 oder UTF-32 kodiert werden - ich würde UTF-8 empfehlen.

Sie können ein Tool wie Wireshark verwenden, um Netzwerkverkehr zu überwachen und zu sehen, wie die Daten aussehen, sollten Sie die Bytes c3 89 für die é sehen. Ich habe noch nie mit Spring gearbeitet, aber wenn es um die JSON-Codierung geht, ist dies wahrscheinlich für Sie richtig erledigt.

Sobald der JSON den Browser erreicht, sollte es gut, wenn es gültig ist. Wie fügen Sie jedoch die Daten aus der JSON-Antwort in die Webseite ein?

52

Die Symptome zeigen an, dass die JSON-Zeichenfolge, die ursprünglich in UTF-8-Codierung war, in die HTTP-Antwort mit ISO-8859-1-Codierung geschrieben wurde und der Webbrowser angewiesen wurde, sie als UTF-8 anzuzeigen. Wenn es mit UTF-8 geschrieben und als ISO-8859-1 angezeigt wurde, dann hätten Sie aériennes gesehen. Wenn es und mit ISO-8859-1 angezeigt wurde, dann hätten Sie gesehen a�riennes.

Um das Problem der JSON-Zeichenfolge falsch als ISO-8859-1 geschrieben zu beheben, müssen Sie Ihre Webanwendung/Spring so konfigurieren, dass UTF-8 als HTTP-Antwortcodierung verwendet wird. Grundsätzlich, sollte es nach dem unter der Decke tun:

response.setCharacterEncoding("UTF-8"); 

Sie ändern Kopf Ihres Inhaltstypen nicht. Es ist vollkommen in Ordnung für JSON und es wurde als UTF-8 angezeigt.

4

, die mir passiert genau das gleiche mit diesem:

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

Aber das funktioniert für mich:

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

Try

;charset=UTF-8 

auf Ihre content hinzufügen.

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

Ich weiß nicht, ob das relevant ist, aber ich habe es mit der @RequestMapping Annotation behoben.

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

Danke Lars Juel Jensen! Ihre Antwort löste mein Problem mit diesem Beitrag http://stackoverflow.com/questions/29865056/jquery-datatables-does-not-show-unicode-characters –

0

Wenn Sie StringEntity versuchen this mit sind, Ihre Wahl der Zeichencodierung verwenden. Es behandelt auch fremde Zeichen.

6

schließlich bekam ich die Lösung:

diese Linie

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

dies wird auf jeden Fall helfen, setzen nur.

0

Auch können Sie auf Feder Anmerkung verwenden über Controller-Klasse RequestMapping für receveing ​​application/json; utf-8 in allen Antworten

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

Wenn die vorgeschlagenen Lösungen oben haben Ihr Problem nicht lösen (wie für mich), könnte das auch helfen:

Mein Problem war, dass ich eine JSON-Zeichenfolge in meiner Antwort mit Springs @ResponseBody zurückgegeben habe. Wenn Sie dies auch tun, könnte dies helfen.

Fügen Sie die folgende Bean zu Ihrem Dispatcher-Servlet hinzu.

<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> 

(Gefunden hier: http://forum.spring.io/forum/spring-projects/web/74209-responsebody-and-utf-8)

1

Die Antworten hier hat mir geholfen, mein Problem zu lösen, obwohl es nicht vollständig in engem Zusammenhang steht. Ich benutze die javax.ws.rs-API und die @Produces und @Consumes-Annotationen und hatte das gleiche Problem - der JSON, den ich im Webservice zurückgegeben habe, war nicht in UTF-8. Ich löste es mit den folgenden Anmerkungen auf meinen Controller-Funktionen:

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

und

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

auf jedem get und post-Funktion des Endpunkts. Ich habe den Zeichensatz nicht gesetzt und das hat es gelöst. Dies ist ein Teil von Jersey, also müssen Sie vielleicht eine Abhängigkeit von Maven hinzufügen.