Кодировка символов JSON

Мое веб-приложение Java отправляет запрос AJAX, который возвращает JSON:

{'value': 'aériennes'} 

Когда на веб-странице отображается «aériennes», оно выглядит как «a riennes», поэтому я предполагаю, что есть какая-то проблема кодирования символов. Заголовки ответов AJAX include

 Content-Type application/json 

который, как представляется, не содержит никакой информации о кодировке. Я думаю, это нужно изменить на что-то вроде

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

Серверная сторона приложения – Spring MVC, и я предполагаю, что должен быть способ установить кодировку по умолчанию для каждого ответа?

Симптомы указывают на то, что строка JSON, которая первоначально была в кодировке UTF-8, была записана в ответ HTTP с использованием кодировки ISO-8859-1, и веб-браузеру было предложено отобразить его как UTF-8. Если он был написан с использованием UTF-8 и отображен как ISO-8859-1, вы бы увидели aériennes . Если бы это было написано и отображено с использованием ISO-8859-1, вы бы увидели a�riennes .

Чтобы исправить проблему строки JSON неправильно написано как ISO-8859-1, вам нужно настроить webapp / Spring для использования UTF-8 в качестве HTTP-ответа. В основном , он должен делать следующее под обложками:

 response.setCharacterEncoding("UTF-8"); 

Не изменяйте заголовок типа содержимого. Это отлично подходит для JSON, и он отображается как UTF-8.

Я не знаю, действительно ли это актуально, но я исправил его с помощью annotations @RequestMapping.

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

Во-первых, ваши опубликованные данные недействительны JSON. Это было бы:

 {"value": "aériennes"} 

Обратите внимание на двойные кавычки: они необходимы.

Данные Content-Type для JSON должны быть application/json . Фактические данные JSON (что мы имеем выше) должны кодироваться с использованием UTF-8, UTF-16 или UTF-32 – я бы рекомендовал использовать UTF-8.

Вы можете использовать такой инструмент, как Wireshark для мониторинга сетевого трафика и посмотреть, как выглядят данные, вы должны увидеть байты c3 89 для é. Я никогда не работал с Spring, но если он делает кодировку JSON, это, вероятно, позаботится о вас должным образом.

Как только JSON достигнет браузера, он должен быть хорошим, если он действителен. Однако как вы вставляете данные из ответа JSON на веб-страницу?

наконец, я получил решение:

Только поместите эту строку

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

это определенно поможет.

То же самое произошло со мной:

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

Но это работает для меня:

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

Попробуйте добавить

  ;charset=UTF-8 

к вашему типу контента.

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

Ответы здесь помогли мне решить мою проблему, хотя это не полностью связано. Я использую javax.ws.rs API и annotations @Produces и @Consumes и имею эту же проблему – JSON, который я возвращал в web-сервисе, не был в UTF-8. Я решил это с помощью следующих аннотаций поверх моих функций controllerа:

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

а также

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

На каждой функции get и post каждой конечной точки. Я не настраивал кодировку, и это решило ее. Это часть трикотажа, поэтому, возможно, вам придется добавить зависимость от maven.

Если вы используете StringEntity попробуйте это , используя ваш выбор кодировки символов. Он также обрабатывает иностранные символы.

Кроме того, вы можете использовать функцию SpringMapping для весеннего annotations над classом controllerа для приема приложения / json; utf-8 во всех ответах

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

Если предлагаемые решения выше не решают вашу проблему (как для меня), это также может помочь:

Моя проблема заключалась в том, что я возвращал строку json в своем ответе, используя Springs @ResponseBody . Если вы это сделаете, это может помочь.

Добавьте следующий компонент в сервлет вашего диспетчера.

       text/plain;charset=UTF-8       

(Найдено здесь: http://forum.spring.io/forum/spring-projects/web/74209-responsebody-and-utf-8 )

  • Кодировка символов jQuery AJAX
  • Давайте будем гением компьютера.