15

JSON RFCのセクション 2.5には、次のように書かれています。

Basic Multilingual Plane にない拡張文字をエスケープするために、文字は、UTF-16 サロゲート ペアをエンコードする 12 文字のシーケンスとして表されます。したがって、たとえばト音記号文字 (U+1D11E) のみを含む文字列は、「\uD834\uDD1E」と表すことができます。

JSON を UTF-16BE (許可されている) としてエンコードする正当な理由があると仮定します。その際、基本多言語面にない文字をエスケープする必要はありますか? たとえば、これの代わりに:

00 5C 00 75 00 44 00 38 00 33 00 34 00 5C 00 75 00 44 00 44 00 31 00 45
  \     u     D     8     3     4     \     u     D     D     1     E

これは の 24 バイトの UTF-16BE バイト シーケンスですが\uD834\uDD1E、これを行うことは合法ですか。

D8 34 DD 1E

つまり、4 バイトの UTF-16BE 値を直接使用しますか?

同様に、同じ JSON 文字列を UTF-32BE としてエンコードする場合、単純に code-point 値を直接使用できますか?

00 01 D1 1E

?

4

2 に答える 2

19

私が知る限り、はい、UTF-16 値を直接書き込むことができます。サポート: 引用した RFC の段落では、任意の Unicodeをエスケープすることにした場合にエスケープする方法について説明しています。ただし、同じセクションの前半で、RFC は次のように述べています。

すべてのUnicode 文字、エスケープする必要がある文字 (引用符、逆ソリッド、および制御文字 (U+0000 から U+001F))を除いて、引用符で囲む

任意の文字エスケープできます。文字が基本多言語面 (U+0000 から U+FFFF まで) にある場合、6 文字のシーケンスとして表すことができます...

(強調を追加しました。)

私にとって、これは、",\および 制御文字のみをエスケープする必要があり、他の Unicode 文字そのまま JSON テキストに (使用している UTF 形式で) 直接配置できることを示しています。また、UTF-8 としてエンコードしている場合でも、 、、および制御文字\uXXXX以外の Unicode 文字にフォームを使用する必要がないこともわかります。"\

(余談ですが、これは\uXXXXフォームが実際に制御文字以外に役立つかどうか疑問に思います。他のポスターが言ったように、おそらく JSON パーサーが実際にサポートしているものに帰着します。)

于 2012-07-25T16:25:38.060 に答える