Что на самом деле означает" Content-type: application/json; charset=utf-8"?

когда я делаю запрос POST с телом JSON для моей службы REST, я включаю Content-type: application/json; charset=utf-8 в заголовке сообщения. Без этого заголовка, я получаю сообщение об ошибке от службы. Я также могу успешно использовать Content-type: application/json без ;charset=utf-8 часть.

что именно charset=utf-8 делать ? Я знаю, что он указывает кодировку символов, но служба отлично работает без нее. Ограничивает ли эта кодировка символы, которые могут быть в теле сообщения?

3 ответов


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

Content-type: application/json; charset=utf-8 обозначает содержимое в формате JSON, закодированное в кодировке символов UTF-8. Обозначение кодировки несколько избыточно для JSON, так как по умолчанию (только?) кодировка для JSON-UTF-8. Таким образом, в этом случае принимающий сервер, по-видимому, счастлив, зная, что он имеет дело с JSON и предполагает, что кодировка UTF-8 по умолчанию, поэтому он работает с заголовком или без него.

ограничивает ли эта кодировка символы, которые могут быть в теле сообщения?

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


чтобы обосновать утверждение @deceze о том, что кодировка JSON по умолчанию-UTF-8...

С IETF RFC4627:

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

Так как первые два символа текста JSON всегда будут ASCII символы [RFC0020], можно определить, является ли октет поток UTF-8, UTF-16 (BE или LE), или UTF-32 (BE или LE) путем смотреть на схеме нули в первых четырех октетах.

      00 00 00 xx  UTF-32BE
      00 xx 00 xx  UTF-16BE
      xx 00 00 00  UTF-32LE
      xx 00 xx 00  UTF-16LE
      xx xx xx xx  UTF-8

отметим, что IETF RFC4627 был заменен IETF RFC7158. В разделе [8.1] он отменяет текст, приведенный @Drew ранее, сказав:

Implementations MUST NOT add a byte order mark to the beginning of a JSON text.