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

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

55 голосов
/ 22 октября 2010

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

{'value': 'aériennes'}

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

Content-Type    application/json

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

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

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

Ответы [ 10 ]

54 голосов
/ 24 октября 2010

Симптомы указывают, что строка 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.

30 голосов
/ 12 марта 2013

Не знаю, актуально ли это, но я исправил это с помощью аннотации @RequestMapping.

@RequestMapping(method=RequestMethod.GET, produces={"application/json; charset=UTF-8"})
15 голосов
/ 23 октября 2010

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

{"value": "aériennes"}

Обратите внимание на двойные кавычки: они обязательны.

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

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

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

8 голосов
/ 28 ноября 2014

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

Только поставьте эту строку

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

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

5 голосов
/ 09 марта 2011

Это случилось со мной точно так же с этим:

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

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

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

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

 ;charset=UTF-8

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

3 голосов
/ 17 февраля 2012
response.setContentType("application/json;charset=utf-8");
1 голос
/ 10 января 2017

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

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

0 голосов
/ 02 ноября 2015

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

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

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

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

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

0 голосов
/ 04 августа 2015

Также вы можете использовать аннотацию пружины RequestMapping выше класса контроллера для получения application / json; utf-8 во всех ответах

@Controller
@RequestMapping(produces = {"application/json; charset=UTF-8","*/*;charset=UTF-8"})
public class MyController{
 ...
}
0 голосов
/ 15 июля 2014

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...