65

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?

Dónal
  • 185,044
  • 174
  • 569
  • 824
  • The suggestion edit queue is full but I would like to replace "Content-Type application/json" with "Content-Type: application/json" so it's more clear that we are talking about a valid HTTP header – Valerio Bozz Oct 19 '22 at 10:24

11 Answers11

65

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.

BalusC
  • 1,082,665
  • 372
  • 3,610
  • 3,555
34

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"})
Lars Juel Jensen
  • 1,643
  • 1
  • 22
  • 31
  • Thank you Lars Juel Jensen! Your answer solved my problem of this post http://stackoverflow.com/questions/29865056/jquery-datatables-does-not-show-unicode-characters – Thiha Zaw Apr 25 '15 at 12:57
19

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?

Thanatos
  • 42,585
  • 14
  • 91
  • 146
9

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.

Sajib Acharya
  • 1,666
  • 5
  • 29
  • 54
AbdulHayee
  • 97
  • 1
  • 4
6

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.

4
response.setContentType("application/json;charset=utf-8");
kapex
  • 28,903
  • 6
  • 107
  • 121
ton
  • 355
  • 3
  • 13
2

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.

matthieusb
  • 505
  • 1
  • 10
  • 34
0

If you're using StringEntity try this, using your choice of character encoding. It handles foreign characters as well.

Community
  • 1
  • 1
craned
  • 2,991
  • 2
  • 34
  • 38
0

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{
 ...
}
0

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)

Erando
  • 811
  • 3
  • 13
  • 27
0

You should set response encoding before you write your answer in the response.

It can be annotation, response.setContentEncoding(String s), or even response.setHeader(String s1, String s2).

Once you start to use response output or writer, defined or guessed encoding will be used to encode characters in the result binary data. That is why you will not have an option to change it afterwards.