Какой тип содержимого заголовка использовать для 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.