My Java web application submits an AJAX request that returns JSON such:
{'value': 'aériennes'}
When 'aériennes' is displayed in the webpage, it appears as 'a?riennes', so I guess there's some kind of character encoding problem. The AJAX response headers include
Content-Type application/json
which doesn't appear to include any charset information. I guess this needs to be changed to something like
Content-Type text/html; charset=iso-8859-1 (or charset=utf8)
The server-side of the app is Spring MVC, and I guess there must be a way to set the default charset for each response?
This question is related to
java
json
spring-mvc
character-encoding
The symptoms indicate that the JSON string which was originally in UTF-8 encoding was written to the HTTP response using ISO-8859-1 encoding and the webbrowser was instructed to display it as UTF-8. If it was written using UTF-8 and displayed as ISO-8859-1, then you would have seen aériennes
. If it was written and displayed using ISO-8859-1, then you would have seen a�riennes
.
To fix the problem of the JSON string incorrectly been written as ISO-8859-1, you need to configure your webapp / Spring to use UTF-8 as HTTP response encoding. Basically, it should be doing the following under the covers:
response.setCharacterEncoding("UTF-8");
Don't change your content type header. It's perfectly fine for JSON and it is been displayed as UTF-8.
First, your posted data isn't valid JSON. This would be:
{"value": "aériennes"}
Note the double quotes: They are required.
The Content-Type for JSON data should be application/json
. The actual JSON data (what we have above) should be encoded using UTF-8, UTF-16, or UTF-32 - I'd recommend using UTF-8.
You can use a tool like Wireshark to monitor network traffic and see how the data looks, you should see the bytes c3 89
for the é. I've never worked with Spring, but if it's doing the JSON encoding, this is probably taken care of properly, for you.
Once the JSON reaches the browser, it should good, if it is valid. However, how are you inserting the data from the JSON response into the webpage?
If the suggested solutions above didn't solve your issue (as for me), this could also help:
My problem was that I was returning a json string in my response using Springs @ResponseBody
. If you're doing this as well this might help.
Add the following bean to your dispatcher servlet.
<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>
(Found here: http://forum.spring.io/forum/spring-projects/web/74209-responsebody-and-utf-8)
I don´t know if this is relevant anymore, but I fixed it with the @RequestMapping annotation.
@RequestMapping(method=RequestMethod.GET, produces={"application/json; charset=UTF-8"})
Also, you can use spring annotation RequestMapping above controller class for receveing application/json;utf-8 in all responses
@Controller
@RequestMapping(produces = {"application/json; charset=UTF-8","*/*;charset=UTF-8"})
public class MyController{
...
}
finally I got the solution:
Only put this line
@RequestMapping(value = "/YOUR_URL_Name",method = RequestMethod.POST,produces = "application/json; charset=utf-8")
this will definitely help.
If you're using StringEntity
try this, using your choice of character encoding. It handles foreign characters as well.
That happened to me exactly the same with this:
<%@ page language="java" contentType="application/json" pageEncoding="UTF-8"%>
But this works for me:
<%@ page language="java" contentType="application/json; charset=UTF-8" pageEncoding="UTF-8"%>
Try adding
;charset=UTF-8
to your contentType.
The answers here helped me solve my problem, although it's not completely related. I use the javax.ws.rs API and the @Produces and @Consumes annotations and had this same problem - the JSON I was returning in the webservice was not in UTF-8. I solved it with the following annotations on top of my controller functions :
@Produces(javax.ws.rs.core.MediaType.APPLICATION_JSON + "; charset=UTF-8")
and
@Consumes(javax.ws.rs.core.MediaType.APPLICATION_JSON + "; charset=UTF-8")
On every endpoint's get and post function. I wasn't setting the charset and this solved it. This is part of jersey so maybe you'll have to add a maven dependency.
response.setContentType("application/json;charset=utf-8");
Source: Stackoverflow.com