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

249
32

В моем веб-приложении 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, и я полагаю, что должен быть способ установить кодировку по умолчанию для каждого ответа?

спросил(а) 2010-10-22T12:35:00+04:00 9 лет, 5 месяцев назад
1
Решение
194

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

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

ответил(а) 2013-03-12T20:47:00+04:00 7 лет назад
252

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

ответил(а) 2010-10-24T18:39:00+04:00 9 лет, 5 месяцев назад
133

Во-первых, ваши опубликованные данные недействительны 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 на веб-страницу?

ответил(а) 2010-10-22T23:51:00+04:00 9 лет, 5 месяцев назад
88

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


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


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

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

ответил(а) 2014-11-28T16:52:00+03:00 5 лет, 4 месяца назад
80

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


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

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


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

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


 ;charset=UTF-8

в ваш contentType.

ответил(а) 2011-03-09T20:23:00+03:00 9 лет назад
72

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

ответил(а) 2012-02-17T04:42:00+04:00 8 лет, 1 месяц назад
51

Ответы здесь помогли мне решить мою проблему, хотя она не была полностью связана.
Я использую javax.ws.rs API и аннотации @Produces и @Consumes и имею эту же проблему - JSON, который я возвращал в web-сервисе, не был в 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.

ответил(а) 2017-01-10T13:41:00+03:00 3 года, 2 месяца назад
37

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


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


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


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

ответил(а) 2015-11-02T12:59:00+03:00 4 года, 4 месяца назад
36

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


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

ответил(а) 2015-08-04T12:55:00+03:00 4 года, 7 месяцев назад
36

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

ответил(а) 2014-07-15T21:39:00+04:00 5 лет, 8 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема