- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:半角カナを拒否したつもりが漢字も拒否されてしまうんです)
半角カナを拒否したつもりが漢字も拒否されてしまうんです
このQ&Aのポイント
- 半角カナを拒否したつもりが、漢字や平仮名も拒否されてしまう現象が起こっています。追加したソースには半角カナの判定処理が含まれており、フリガナ欄では正常に動作していますが、住所欄などにも使いたい場合には問題があります。
- 現在のソースでは、半角カナ以外の文字も拒否してしまう原因が分かりません。追加した部分以外に漢字や平仮名を拒否する処理が含まれている可能性も考えられますが、具体的な理由や対処法がわかる方がいると助かります。
- 半角カナを拒否する処理を追加した結果、漢字や平仮名も拒否される問題が発生しています。フリガナ欄ではこの拒否処理を使用することができますが、住所欄などでは利用することができません。原因や対処法について知っている方がいらっしゃれば、教えていただきたいです。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
なぜそのような動作になるか、ですが、文字を文字単位ではなく バイト単位でなめていっているからです。 たとえばShiftJISだと >printf "\xc5" ナ 0xc5 は(変換されてますが)半角カナの'ソ’です。 そして、 >printf "\x93\c5" 駐 のように、文字の一部に同じ値のバイトを 持ってしまっているものが幾つかあります。 このため、 if($xx =~ /[\xA1-\xDF]/) この判定に引っかかってしまっているというわけです。 つかリンク先見ましたけどひどいですね。 とりあえず $jd_EUC_J_k = '(\xA5[\xA1-\xF6])|(\x8E[\xA6-\xDF])'; # EUC_JP $jd_s_JIS_k = '(\x83[\x40-\x96])|([\xA6-\xDF])'; # ShiftJIS この辺で何をしようとしているのか良くわかりませんが、 とりあえず ecu-jp なら、0x8e が出てるかどうかだけみても 半角カナがあるかどうかは判定できます。 ShiftJISは文字単位で考慮してみないといけないですね。 Unicodeに変換していいのなら話はラクなんですが ダメですか?w
お礼
早々にご回答頂きましてどうもありがとうございました! ははぁ、2バイト文字までチェックされちゃうんですね。 納得です。 私はPerlの知識が浅いので、「もしやif($xx =~ /[\xA1-\xDF]/)というのは"半角カナが含まれている場合"じゃなくて"全角カナ以外の文字が含まれている場合"という判別方法だったりして?」と思ってしまっていました。 > ecu-jp なら、0x8e が出てるかどうかだけみても > 半角カナがあるかどうかは判定できます。 あ、そうなんですか! それなら、丁度、このCGIでは後にデータをeucに変換している部分があるので、そこにエラー判定を持って行くことで私でもいじれそうです。 Unicodeにしちゃうと、後でそれをどういじったらいいかまたわからなくなっちゃうので、 eucでやってみます。 どうもありがとうございました!