- ベストアンサー
テキストフィールドの入力文字の制限に関する質問(ActionScript)
text_txt.restrict = "+\\-*/"; 上記のアクションスクリプトで入力文字を「+-*/」に制限することができるのですが \\がないと「+/」のみしか入力ができない理由がわかりません。 \\がエスケープ文字だということはわかるのですが だとしたら、なぜ\\がないと「*」まで入力できなくなるのかがわかりません。 OS:WindowsXP SP2 SOFT:Flash MX 2004 Professional ご存知の方がおられましたらご回答をよろしくお願いします。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
restrict で、テキストフィールドに入力できる文字を範囲で指定する場合は、 1) 文字列の左から右へ解釈される 2) ASCII コードの若い順に、入力可能な文字として登録される という特徴があります。 1) は、例えば txt.restrict = "A-Z"; とあった場合、” A から Z までを入力可能にする”という意味として解釈するとのことだけなので、特に問題はないと思います。 2) は記号ではちょっと分かりにくいかと思いますので、別の例で考えてみましょう。 アルファベットの ASCII コードは、アルファベット順に若い番号からコードが割り振られています。 例えば txt.restrict = "A-Z"; と定義すると、大文字の A は Z よりも若いコードが割り振られていますから、大文字の A から Z までの文字を入力できます。 では、これを逆さにして txt.restrict = "Z-A"; とした時はどうなるでしょうか。 先述の 1) の特徴の通り、restrict の文字列は左から解釈されます。つまり、” Z から A までを入力可能にする”と解釈されます。 しかし、Z の ASCII コードは A よりも後ろです。 この例では、A から Z ではなく、Z だけが入力可能な文字として設定されます。 restrict を範囲で指定した時は、do while ループで入力可能文字が登録されると考えると分かりやすいと思います。 イメージとしては、次のようなスクリプトです。 code = 'Z'; do { /*ここに、code の値を使って restrict に登録する処理を書く*/ code++; } while( code <= 'A' ); 'Z' と 'A' を Z と A の ASCII コードとします。 do while ループでは最初の1回は必ず処理が行われますから、Z は条件に関係なく restrict に登録されます。 code の値を + 1 してループ継続の条件を判断すると、code の値 ( Z の次の ASCII コード)は A の ASCII コードよりも大きくなり、ループは打ち切られます。 従って、登録されるのは Z だけとなります。 長くなりましたが、話は記号に戻って txt.restrict = "+-*/"; とした場合を細かく見てみますと。 まず、マイナス( - )は範囲を表すための制御記号と判断されますから、” + から * までの範囲の文字と、/ を登録する”と解釈されます。 アスタリスク( * )の ASCII コードは 0x2A 、プラス( + )は 0x2B で、実はアスタリスクの方が若いコードが割り当てられています。 よって、” + から * まで”の範囲指定では + しか登録されません。 ですから、これと個別に指定したスラッシュ( / )と合わせて、+ と / しか登録されないことになるのです。 + からではなく txt.restrict = "*-/"; このように * を先に書くと、* から / までの文字が登録されます。 ASCII コード表を見てみると、該当するのは「 * + , - . / 」の6文字です。 ちなみに、ASCII コード表についてはこちらをご参照ください。 ・IT用語辞典 e-Words:ASCII文字コード http://e-words.jp/p/r-ascii.html エスケープ文字である \\ を挿入した時は、- は制御文字としてではなく、”マイナスの記号も登録する”と解釈されます。 つまり、 txt.restrict = "+\\-*/"; は、単純に「 + - * / 」の4つの記号を1文字ずつ登録するものと見なされるので、ASCII コードの順序は関係ないというわけです。
お礼
>アスタリスク( * )の ASCII コードは 0x2A 、プラス( + )は 0x2B で、 >実はアスタリスクの方が若いコードが割り当てられています。 アスタリスクのほうがプラスよりも若いコードが割り当てられていたのですね。 先入観でプラスの方が若いコードが割り当てられているものだと思っていました。 今後はASCII文字コード表をちゃんと見て気をつけたいと思います。 丁寧でわかりやすいご回答をしていただきどうもありがとうございました。