1. ホーム
  2. character-encoding

[解決済み] Content-type: application/json; charset=utf-8」の本当の意味は何ですか?

2022-03-16 16:35:34

質問

RESTサービスにJSONボディを持つPOSTリクエストを行う際、以下のような記述があります。 Content-type: application/json; charset=utf-8 をメッセージヘッダに追加しました。このヘッダーがない場合、サービスからエラーが発生します。また Content-type: application/json を使用せずに ;charset=utf-8 の部分を削除します。

は具体的にどのようなものなのでしょうか? charset=utf-8 do ? 文字コードを指定しているのは知っていますが、指定しなくてもサービスは問題なく動作します。このエンコーディングによって、メッセージの本文に使用できる文字が制限されるのでしょうか?

解決方法を教えてください。

ヘッダーは、コンテンツが何でエンコードされているかを示すだけです。コンテンツそのものからコンテンツの種類を推し量ることは必ずしもできません。そのためにHTTPヘッダーがあり、受信者にどんな種類のコンテンツを扱っているのか(と思われる)ことを伝えます。

Content-type: application/json; charset=utf-8 は、文字コードUTF-8でエンコードされたJSON形式のコンテンツであることを指定します。JSONのデフォルト(唯一?)のエンコーディングはUTF-8なので、エンコーディングを指定することはJSONの場合、やや冗長です。この場合、受信側のサーバーは、JSONを扱っていることに満足し、デフォルトのエンコーディングがUTF-8であると仮定して、ヘッダーの有無にかかわらず動作するようにしているようです。

<ブロッククオート

このエンコーディングでは、メッセージの本文に入れることができる文字が制限されるのでしょうか?

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