1. ホーム
  2. web-services

[解決済み] JSONの文字エンコーディング - UTF-8はブラウザでよくサポートされていますか、それとも数字のエスケープシーケンスを使用すべきですか?

2022-03-12 17:32:37

質問

私は、リソースを表現するためにjsonを使用するウェブサービスを書いています。そして、jsonをエンコードする最良の方法について考えて、少し困っています。json rfcを読むと ( http://www.ietf.org/rfc/rfc4627.txt ) エンコーディングはutf-8が好ましいことは明らかです。しかし、rfcは文字を指定するための文字列エスケープメカニズムも記述しています。これは一般的に非アスキー文字をエスケープするために使用され、それによって結果のutf-8を有効なアスキー文字にすると推測されます。

そこで、asciiではないUnicode文字(コードポイント)を含むjson文字列があるとします。ウェブサービスはこれをutf-8エンコーディングして返すべきでしょうか、それともこれらの非アスキー文字をすべてエスケープして純粋なアスキー文字を返すべきでしょうか?

ブラウザでjsonpやevalを使って結果を実行できるようにしたいのですが。それは判断に影響するのでしょうか?様々なブラウザのjavascriptのutf-8対応についての知識が不足しています。

EDIT: 結果をどのようにエンコードするかという私の主な懸念は、実際には結果のブラウザ処理についてであることを明確にしたかったのです。私が読んだところでは、特にJSONPを使用する場合、ブラウザはエンコーディングに敏感である可能性があるようです。この件に関して本当に良い情報を見つけられていないので、何が起こるかを確認するために、いくつかのテストを開始する必要があります。理想的には、必要な数文字だけをエスケープして、結果をutf-8エンコードしたいと思います。

どのように解決するのですか?

JSONの仕様 が必要です。 デコーダはUTF-8をサポートしています。その結果、すべてのJSONデコーダは、数値エスケープシーケンスを扱えるのと同様に、UTF-8を扱えるようになりました。 これは、Javascriptインタープリタについても同様で、JSONPはUTF-8でエンコードされたJSONを同様に扱うことになります。

JSONエンコーダーが数値エスケープシーケンスを代わりに使用できるようになったことで、選択肢が増えました。 数値エスケープシーケンスを選択する理由の1つは、トランスポートメカニズムが 間に エンコーダと目的のデコーダがバイナリセーフでない場合。

数値エスケープシーケンスを使用したいもう一つの理由は、以下のような特定の文字がストリームに現れるのを防ぐためです。 < , &" これは、JSONコードがHTMLにエスケープされずに配置されたり、ブラウザが誤ってHTMLとして解釈した場合に、HTMLシーケンスとして解釈される可能性があります。これは、HTMLインジェクションやクロスサイトスクリプティングに対する防御となり得ます(注意: JSONではいくつかの文字はエスケープされなければなりません(MUST)。 "\ ).

フレームワークの中には、PHPの json_encode() (デフォルトでは)です。 常に は、ASCII 以外の文字に対してエンコーダ側で数値エスケープシーケンスを行います。 これは、限られたトランスポート機構などとの互換性を最大限に高めるために意図された、ほとんど不要な追加ステップです。 しかし、これは、JSONデコーダがUTF-8で問題があることを示すものとして解釈されるべきではありません。

だから、こうやってどっちを使うか決めればいいんだと思う。

  • エンコーダーとデコーダーの間のストレージやトランスポートに使用しているソフトウェアがバイナリセーフでない場合を除き、UTF-8を使用してください。

  • それ以外の場合は、数値のエスケープシーケンスを使用してください。