テキストデータの中に、半角文字(タグ、などの危険文字含む)と全角文字が存在していた場合、強制的に半角文字を削除してしまう方法はないでしょうか?
文字コードを統一して、いろいろやってみましたが、なかなかうまくいきません。
よろしくお願いします。
ASCII 文字はコードポイント 20~7E、半角カナはコードポイント FF61~FF9F にあるので (Unicode対応 文字コード表)、
仮に元の文字列が Shift_JIS だったとしたら、
use Encode; # Encode モジュールを使う
my $text = 'Perlについての質問デス。'; # 元の文字列
$text = decode('Shift_JIS', $text); # UTF-8 文字列に変換
$text =~ s/[\x{20}-\x{7E}\x{FF61}-\x{FF9F}]//g; # 半角文字削除
print encode('Shift_JIS', $text); # Shift_JIS バイト列に戻して出力
という感じで「Perl」と「デス」が削除されて表示される、という感じでしょうか。
Perl で作成されている掲示板のような、一般的に Web で入力されたデータをそのまま表示すると危険、みたいなケースの場合、
・<> 文字をエンコードする。
・半角カナを全角カナに変換する。
などの手法で対応されていると思います。
タグ記号などは下記の手法で、エンコードできます。
$_ =~s/</</g;
$_ =~s/>/>/g;
また、半角カナなどの変換には Jcode を用いた変換が一般的です。
Perl でプログラムする際に重宝するメモサイトが下記です。
一通り眺めてみれば、やりたいことが実現できるかもしれません。
ありがとうございます。
参考にさせていただきます。
いろいろとがんばっていますが、まだまだですね、自分は(;;)
ありがとうございました
ASCII 文字はコードポイント 20~7E、半角カナはコードポイント FF61~FF9F にあるので (Unicode対応 文字コード表)、
仮に元の文字列が Shift_JIS だったとしたら、
use Encode; # Encode モジュールを使う
my $text = 'Perlについての質問デス。'; # 元の文字列
$text = decode('Shift_JIS', $text); # UTF-8 文字列に変換
$text =~ s/[\x{20}-\x{7E}\x{FF61}-\x{FF9F}]//g; # 半角文字削除
print encode('Shift_JIS', $text); # Shift_JIS バイト列に戻して出力
という感じで「Perl」と「デス」が削除されて表示される、という感じでしょうか。
ありがとうございます。
SJISに限る場合にこれは大変有効ですね!これは利用できそうです。
とりあえず、この操作でタグとか一気にとれてしまうでしょうか?
ありがとうございました。
ありがとうございます。
SJISに限る場合にこれは大変有効ですね!これは利用できそうです。
とりあえず、この操作でタグとか一気にとれてしまうでしょうか?
ありがとうございました。