20

最近、ブラウザのサポートでデータ品質が原因でバグが発生しました。必要な場合を除き、ダブルサイズなしで文字列エスケープを適用するための安全なルールを探しています。

UTF-8 バイト シーケンス "E2-80-A8" (U+2028、LINE SEPARATOR)、Unicode データベースで完全に有効な文字。ただし、そのシーケンスは行区切り記号を表します (はい、「0A」以外)。

そして残念なことに、多くのブラウザー (Chrome、Firefox、Safari など。他はテストしていません) は、その Unicode 文字を含む文字列を持つ JSONP コールバックを処理できませんでした。JSONP は、私が制御できない非 Unicode HTML に含まれていました。

ブラウザーは、デバッグ ツールやすべてのテキスト エディターから有効に見える JavaScript で無効なコード/構文エラーを報告するだけでした。私が推測するのは、「E2-80-A8」をBIG-5に変換しようとして、JS構文が壊れた可能性があるということです。

上記は、Unicode がシステムを予期せず破壊する可能性のある例にすぎません。私の知る限り、一部のハッカーは RTL やその他の制御文字を自分の利益のために使用できます。また、Unicode 仕様には「引用符」、「スペース」、「記号」、「コントロール」が多く含まれています。

質問:

すべてのプログラマーがアプリケーションで有効にしたくない隠れた機能 (およびバグ) について知っておくべき Unicode 文字のリストはありますか? (たとえば、Windows はファイル名で RTL を無効にします)。

編集:

JSON も JavaScript も求めていません。すべてのプログラムでの Unicode 処理の一般的なベスト プラクティスを求めています。

4

4 に答える 4

9

文字列に改行を含めることができないため、JavaScriptが壊れます。

var myString = "

";

//SyntaxError: Unexpected token ILLEGAL

現在、UTF-8シーケンス"E2-80-A8"はユニコードコードポイントU+2028にデコードされます。これは、javascriptの改行と同様に扱われます。

 var myString = "
";

//Syntax Error

ただし、書くのは安全です

var myString = "\u2028";
//you can now log myString in console and get real representation of this character

これは、適切にエンコードされたJSONに含まれるものです。安全でない文字のブラックリストを保持する代わりに、JSONを適切にエンコードすることを検討します。(U+2028とU+2029 AFAIKです)。

PHPの場合:

echo json_encode( chr(0xe2). chr(0x80).chr(0xA8 ) );
//"\u2028"
于 2012-05-11T19:18:13.063 に答える
4

Unicodeチャートを見てください。印刷されない文字のリストがあります。これらは潜在的なトラブルメーカーになるものです。あなたの友人U+2028にはたくさんの友人がいます:http://www.unicode.org/charts/PDF/U2000.pdfそしてそれは2000年の範囲だけではありません。

それらをすべて削除するか、異なるカテゴリに分類することができます(U +2028のようなSEP文字が\nになるか、適切にエスケープされます)。

HTH

于 2012-05-19T16:45:59.637 に答える
4

文字プロパティのデータベースとそれを説明するレポートであるUNICODE CHARACTER DATABASEがあり、ブラウザーがコード ポイントをどのように「扱うべき」かについての良いアイデアを提供します。「すべき」という言葉が好きです。最も安全なのはホワイトリストです。おそらく、L|M|N|S、文字、マーク、数字、または記号を使用できます。

図書館のICUプロジェクトを見てみましょう

于 2012-05-20T18:00:45.550 に答える
3

AZ、az、および 0-9 は一般的に安全です。これらの 62 文字を超えると、一部のシステムで問題が発生します。誰もあなたに与えることができる他の答えはありません。

たとえば、ドメイン名について言及します。Unicode ドメイン名を処理する唯一の方法は、RFC 3454 および RFC 5890-5893 に従い、その方法でのみデータを処理することです。ほとんどの Unix ファイルシステムのファイル名は、/ または \0 を含まない任意のバイト文字列です。Unix でファイル名を機能的に Unicode 文字列として扱い、何も壊さずに扱うこと自体が問題です。Windows ファイル名は AZ セーフではないことに注意してください。NUL や PRN などは予約名です。各ドメインには独自の小さな問題や癖があり、単純な要約だけでは十分ではありません。

于 2012-05-18T01:11:07.097 に答える