web-dev-qa-db-ja.com

"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は正確に何をしますか?私はそれが文字エンコーディングを指定していることを知っていますが、サービスはそれなしでもうまく動きます。このエンコーディングはメッセージ本文に含めることができる文字を制限しますか?

237
DenaliHardtail

ヘッダは、コンテンツがエンコードされているものを示しているだけです。コンテンツ自体からコンテンツの種類を推測することは必ずしも可能ではありません。つまり、必ずしもコンテンツを見てそれをどう処理するかを知ることはできません。これがHTTPヘッダの目的であり、受信者にどのような種類のコンテンツを扱っているのかを伝えます。

Content-type: application/json; charset=utf-8は、コンテンツをJSON形式にし、UTF-8文字エンコードでエンコードするように指定します。 JSONのデフォルトの(唯一の)エンコードはUTF-8であるため、エンコードの指定はJSONにとってやや冗長です。そのため、この場合、受信側サーバーはJSONを扱っていることを知って幸せで、デフォルトではエンコードがUTF-8であると想定しているため、ヘッダーがあってもなくても機能します。

このエンコーディングはメッセージ本文に含めることができる文字を制限しますか?

いいえ。ヘッダーと本文には、必要なものをすべて送信できます。しかし、両者が一致しないと、間違った結果が出る可能性があります。ヘッダーでコンテンツがUTF-8エンコードされているが、実際にLatin1エンコードされたコンテンツを送信していると指定した場合、受信側はLatin1エンコードデータをUTF-8として解釈しようとしてゴミデータを生成する可能性があります。もちろん、Latin1でエンコードされたデータを送信することを指定していて、実際に送信していると指定した場合、はい、Latin1でエンコードできるのは256文字に制限されています。

240
deceze

デフォルトのJSONエンコーディングはUTF-8であるという@ decezeの主張を実証するために...

からIETF RFC4627

JSONテキストはUnicodeでエンコードする必要があります。デフォルトのエンコードはUTF-8です。

JSONテキストの最初の2文字は常にASCII文字になるため[RFC0020]、オクテットストリームがUTF-8、UTF-16(BEまたはLE)、またはUTF-8のいずれであるかを判別できます。 32(BEかLE)は最初の4オクテットのヌルのパターンを見ることによって。

      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
133
Drew Noakes

IETF RFC4627IETF RFC7158 に置き換えられたことに注意してください。セクション[8.1]では、@Drewが前に引用したテキストを以下のように撤回します。

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

私は@decezeに完全に同意しますが、私はこれを開発したいと思います "私はサービスからエラーが出ます" 質問の一部、

このようなエラーは http 415 のようになります。

HTTP 415サポートされていないメディアタイプエラー

HTTP 415 Unsupported Media Typeクライアントエラー応答コードは、ペイロード形式がサポートされていない形式であるため、サーバーが要求の受け入れを拒否していることを示しています。

フォーマットの問題は、要求に示されたContent-TypeまたはContent-Encoding、あるいはデータを直接検査した結果である可能性があります。

つまり、 https://stackoverflow.com/a/22643964/914284 に見られるような例です。

  • 正しいコンテンツタイプを設定する必要があり、Add Content-Type:application/jsonおよびAccept:application/jsonのように正しいコンテンツタイプを受け入れる必要があります。それ以外の場合はデフォルトを想定します
1
marven

Dart httpの実装はその「charset = utf-8」のおかげでバイトを処理するため、応答からバイトを読み取るときに「latin-1」フォールバック文字セットを回避するために、いくつかの実装がこれをサポートしていると確信しています。私の場合、応答本文の文字列の形式が完全に失われるため、バイトエンコードを手動でutf8に行うか、サーバーのAPI応答にそのヘッダー「内部」パラメーターを追加する必要があります。

0
roipeker