- 締切済み
半角カナ入力について
perlを使って入力項目を作っている人間です。 ある事に苦戦しています。 半角カナを入力すると文字化けが出てしまうので半角カナを入力しないように注意を促しているのですが、どうしても半角カナを入れてしまう人が入るので、半角カナを入力した時点で、注意事項をCGIで処理したいと思います。 しかし、CGIで処理する場合はどのようにすればいいのか解りません。 何かヒントなどを教えて頂けないでしょうか ? 又参考になるURLなどがありましたら教えて下さい。 お願します。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- nuki
- ベストアンサー率30% (6/20)
日本語文字コードをPerlで扱う際には、以下の参考URLが非常に役に立つでしょう。 「日本語を扱う」の「全角文字が含まれているか判定する」に、お探しの半角(SBCS)かなの判定方法が記載されています。 私も過去に仕事で随分と助けられました。 この他に「改行コード」関連も参考になりますよ。
- leaz024
- ベストアンサー率75% (398/526)
文字コードの変換には jcode.pl をお使いですか? 半角カナが化けるというのは、半角カナを、そのまま jcode::convert にかけるからです。 フォームの中に、ダミーで良いので、確実に jcode が sjis か euc かを判別できる全角文字を入れておき、それの文字コードを使って jcode を通すようにします。(多分、普通の全角文字は、大抵は正確にコード判定できると思います。) 例えば、HTMLのFORM内に、次の行を入れておきます。 <INPUT type="hidden" name="samplecode" value="あ"> で、デコードルーチンを、次のようにしておきます。 foreach (@pairs) { my ($key,$val) = split(/=/,$_); $val =~ tr/+/ /; $val =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg; # この位置で jcode にかけると、半角カナが化ける $FORM{$key} = $val; } # 「あ」の文字コードを調べ、全パラメータを変換 $icode = &jcode::getcode(\$FORM{samplecode}); foreach (keys %FORM) { &jcode::convert(\$FORM{$_}, 'sjis', $icode); } こうすることで、シフトJISで半角カナを使っても、文字化けしません。 # jcode::getcode によって、$icode には「euc」や「sjis」が入るので、それを jcode::convert の第3引数にします。 # この第3引数は、元の文字コードを明示指定するもので、省略すると jcode が getcode を使って自動判別します。
了解しました。 えとですね。シフトJISであれば、正規表現を工夫するのが高速でいいんですが、確実をきすならば for を使うべきでしょう。場合によって処理しわけてください。 で、漢字コードの判別は、2バイトコードのヘッダが決まっているので、0x81~0x9F または 0xE0~0xEF であれば、続く1バイトと合わせて2バイトが漢字であると分かります。 詳しくは参考URLを見てみてください。
アスキーコード表を掲載しますので、半角カタカナの文字コードを見てみてください。 このとき、漢字でもなく、なおかつカタカナであるコードが入力された場合に、省くなり全角カタカナに直すなりすればいいのです。 具体的なロジックについては、どこから説明すればいいのか分からないので補足ください(^_^;
補足
補足です。 $dat ← 全角と半角が混じった文字列データ # 半角が含まれているかどうかチェックします。 if ( $dat =~ /[\xA1-\xDF]*/ ) { ここで、半角カタカナが含まれているという メッセージを出して処理を停止する。 } 上記のようにやると全角コードも判定してしまう。