Какой тип содержимого заголовка использовать для JSON? "application/json; charset = utf-8" или "application/json"?

Кажется, кодировка JSON по умолчанию - UTF-8, и Spring MVC возвращает application/json; charset=utf-8 по умолчанию, что трудно изменить.

Ответы

Ответ 1

Согласно RFC 4627

Текст JSON будет закодирован в Юникоде. Кодировка по умолчанию - UTF-8.

Далее описывается, как нужно различать кодировку UTF- *, предполагая, что никакие другие кодировки не поддерживаются.

"SHALL" представляет собой абсолютное требование здесь (см. RFC 2119).

И действительно нет причин использовать кодировку без UTF с JSON (поскольку все, что может обрабатывать JSON, может определенно обрабатывать UTF-8).

Ответ 2

Возвращение параметра charset в application/json неверно, так как этот тип носителя не определяет параметр charset. Смотрите https://greenbytes.de/tech/webdav/rfc8259.html#rfc.section.11, последнее предложение:

Примечание: для этой регистрации не определен параметр "charset". Добавление одного действительно не влияет на совместимых получателей.

Ответ 3

Заголовок просто обозначает, в чем кодируется содержимое. Не обязательно выводить тип содержимого из самого содержимого, т.е. вы не можете просто просто посмотреть контент и знать, что с ним делать. Для того, для чего предназначены HTTP-заголовки, они сообщают получателю, какой контент они (предположительно) имеют дело с.

Content-type: application/json; charset=utf-8 

обозначает содержимое, которое должно быть в формате JSON, закодированное в кодировке символов UTF-8. Назначение кодировки несколько избыточно для JSON, поскольку кодировка по умолчанию (только?) Для JSON - это UTF-8. Таким образом, в этом случае получающий сервер, по-видимому, счастлив, зная, что он имеет дело с JSON и предполагает, что кодировка UTF-8 по умолчанию, почему он работает с заголовком или без него.

Does this encoding limit the characters that can be in the message body?

Нет. Вы можете отправить все, что хотите, в заголовок и тело. Но, если они не совпадают, вы можете получить неправильные результаты. Если вы укажете в заголовке, что содержимое кодировано в кодировке UTF-8, но вы фактически отправляете контент с кодировкой Latin1, получатель может создавать данные об мусоре, пытаясь интерпретировать данные с кодировкой Latin1 как UTF-8. Если, конечно, вы укажете, что вы отправляете кодированные данные Latin1, и вы на самом деле делаете это, тогда да, вы ограничены 256 символами, которые вы можете кодировать в Latin1.