2012-10-27 14 views
13

For example, is it valid ajax requesthttp/1.1のapplication/jsonコンテンツタイプでcharsetパラメータを使用できますか?

$.ajax({ 
    type: "POST", 
    url: "SomePage.aspx/GetSomeObjects", 
    contentType: "application/json; charset=utf-8", 
    ... 
}); 

それは、used as an example sometimes、またはソフトウェアcan break without explicit charsetです。

The MIME media type for JSON text is application/json. 

Type name: application 

Subtype name: json 

Required parameters: n/a 

Optional parameters: n/a 

It can be interpreted that charset shouldn't be used with application/json

The rfc 4627 for application/json media typeは、セクション6で任意のパラメータを受け入れないことを言います。 UTF-8,16,32エンコーディングは、コンテンツからinferedすることができますので、

JSON text SHALL be encoded in Unicode. The default encoding is 
UTF-8. 

Since the first two characters of a JSON text will always be ASCII 
characters [RFC0020], it is possible to determine whether an octet 
stream is UTF-8, UTF-16 (BE or LE), or UTF-32 (BE or LE) by looking 
at the pattern of nulls in the first four octets. 

     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 

そしてsection 3は、文字セットを指定する必要はありませんことを を示唆しています。 UTF-8がデフォルトであると言うのはなぜですか?他の文字エンコーディングを選択する方法はrfcで指定されておらず、エンコーディングは確定的に使用できます。または、Unicodeをサポートする他の(UTF-8,16,32ではなく)文字エンコーディングがありますか?

が、私はそれが落とさなければならないことを、あなたの評価に同意:

は、いくつかは charset can be usedと主張しています。 RFC 2046 には、「テキストのサブタイプ以外の他のメディアタイプは、 アプリケーションタイプでは、文字セットパラメータの存在に制限がないことを示しているので、ここで定義されているように、 文字セットパラメータを使用することを選択できます。さらにRFC2045は、 "MIME 実装では、 の名前が認識されないパラメータは無視しなければならない"と述べています。したがって、その存在によって何か害があると仮定することは妥当ではない。

5 rfc準拠のソフトウェアは、charsetパラメータを使用してcontent type application/jsonを生成しますか? rfc準拠のソフトウェアはそのような要求を受け入れるべきですか?

答えて

6

最近json rfc 7159 says

注:いいえ、 "文字セット" パラメータは、この登録のために定義されています。
これを追加することは、準拠する受信者に実際には影響しません。

つまり、charsetは、準拠した受信者によって無視される必要があります。

rfc 2045と一致します。"MIME実装では、名前が認識できないパラメータは無視する必要があります。" rfc 7159は依然として"必須パラメータ:該当なし;オプションパラメータ:該当なし" application/json mimeメディアタイプ(パラメータなし)の場合はを指定しているためです。

jsonテキストはオブジェクトまたは配列に制限されなくなり、最初の2文字に基づいて文字エンコーディングを計算するold section 3は新しいrfcではなくなりました。 UTF-8、UTF-16、またはUTF-32は許可されていますが、エンコードを指定する方法はありません(BOMなし、UTF-8がデフォルトです)。

http/1.1のapplication/jsonコンテンツタイプでcharsetパラメータを使用できますか?

charset="utf-8"が使用されている場合も害はありません - UTF-8が値に準拠した受信者によって無視されなければならないので、JSONテキストが、他の値のデフォルトエンコーディングは誤解を招くかもしれないです。 Content-Typeヘッダを正しく解析しないクライアント(例えば、by comparing it verbatim with "application/json")、またはjsonテキストをデコードするためにutf-8エンコーディング以外のものを使用しようとするクライアントを壊すだけです。

5月rfc準拠のソフトウェアは、charsetパラメータを使用してcontent type application/jsonを生成しますか?

なし。 application/jsonのパラメータは定義されていません。

rfc準拠のソフトウェアはそのような要求を受け入れるべきですか?

はい、そうです。 charsetの値は無視する必要があります。


ECMA-404(JSONデータ交換フォーマット)、すなわち、JSON自体は、符号化の詳細に関していかなる行動を指定しないUnicodeコードポイントの点でJSONテキストを定義します。

ECMA-262(ECMAScript言語仕様)では、文字列(Unicode型)の上にjson形式も定義しています。

8

application/jsonはcharsetパラメータを定義していないため、それを含むことは間違いです。 RFC 2046によると、一般的なアプリケーションタイプは、にapplication/xmlなどのcharsetパラメータを持つことができます。しかし、JSONはそうではありません。

+0

rfc 2045からの引用はどうですか?適切な文字セットを送信することは安全でなければなりません。 – jfs

+0

@ J.F.Sebastian:話している実装が関連するすべての標準を手紙に正確に実装していると仮定しています。それはかなり大きな前提です。通常は、「(a)間違いなく間違っていませんか?そして(b)多少間違っている実装との相互運用性の問題を起こす可能性は低いですか? –

+0

@Henning:no。私はそれを仮定していない(私の質問とその中のいくつかのリンクでは、非確認の例を見ることができる)。そして私は(a)と(b)の両方に同意します。適切な文字セットを送信すると、やや間違った実装が破られる場合があります。 – jfs

0

rfc準拠のソフトウェアでこのような要求を受け入れる必要がありますか?

Julian Reschkeの答えによると、明らかにそうではありません。しかし、あなたが指摘したように、の場合、野生でそれに遭遇する可能性があります。その場合、非rfc準拠のホストと話したい場合はに対処する必要があります。

Accept-CharsetとHTTPフレームワークのテキストベースのメッセージのコンテンツタイプの文字セット部分を処理するコードがある場合は、JSON用に使用するだけではいかがですか?プログラミング上、それはもっと簡単です(jsonの特別なルールはありません)とより一般的です。

個人的には、テキストのすべてのビットについて、Unicode(引用符で囲んだ検出を使用)を使用しましょう。残念ながら、そこにはクライアントのデバイスがあります。日本の携帯電話は、Unicodeを処理しませんが、Shift_JISのみを処理します。そうでなければ、彼らは満足しているJSONの消費者(そして顧客を払っている)になるでしょう。で、どうするつもり?私の特別なケースでは、これらのクライアントを利用するために、標準HTTPメカニズムを使用してcharsetを構成可能にしました。

ここでは、HTTP 2.0が現在作業中であり、厳格に遵守されている標準を作成しようと思っている人は、受け入れテストを書く必要があります。もちろん、ルールが時々曲がることができない場合は、前述のレガシークライアントを除外することもできます。

他に誰もあなたがいない場合、それに準拠している点は何ですか? Operaでも準拠しているのだろうか、それともそれが実装しているすべてのRFCを最初から明白に解釈できるかどうかは疑問です。私はそうは思わない、特に大きいものの場合はHTTPのように。

HTTPバッシングのように聞こえる場合は、私に言いましょう.HTTPは、インターネットだけでなく革新的な概念を持つ偉大な標準です。例。リソースが指定されている(ステートレス)、またはキャッシングの方法は、多くのアプリケーションの実装に流入した良いパターンを確立しています。そして、HTTP 2は、1.1がどこで中止されたかを知ることができます。ちょうどSPDYが、私はそれを言うことを憎むが、それは、MicrosoftのHTTP速度+モビリティのように見えるこの場合には多くの方法である1 1に採用されないことを期待しましょうよりHTTP -ey Googleの強引より(かつunRESTySPDY

+0

UTF-8を扱えないがXHRを持つ日本の携帯電話には引用が必要ですJSONを処理します(JSON-Pなどとは対照的です)。 – hsivonen

+0

@hsivonenそれは私たちの製品を使用する顧客からの声明でした。その理由から、製品を変更する必要がありました。顧客はそれを支払う必要があったので、彼らは正しいと思います。残念ながら、私はモデルやOSなどの詳細はありません。 –

関連する問題