« 半角のみの書き込みを許さないCGI | トップページ | サブルーチンの引数として配列を渡す Perl »

2007-08-15

半角/全角の変換

掲示板の利用者が、ほとんど初心者で、
機種依存文字、半角カタカナの使用に
まったく躊躇しない人達なので、
最低でも、半角カタカナは全角に変換しようと思います。
更に、全角の英数字などを使うので、
検索機能が正常に機能しなくなってしまいます。
そこで、英数記号は半角に変換します。
調べた限りでは、jcode.plのh2zでできそうです。
&jcode::h2z_sjis( \$val); # 半角カタカナを全角カタカナに変換
&jcode::convert( \$val, 'sjis' ); # 外部モジュールjcode.plのconvert関数呼び出し
これで、ShiftJISの半角カナを全角カナに変換できました。
次に、全角英数記号の半角化です。
どうやら、こちらの方が難しそうです。
変換後にShift_JISで返すサブルーチンを作りました。
###############################
#
# 全角の英数記号を半角にする
#
sub z2h_alphabet
{
  my ($str) = @_; # 引数 変換対象文字列
  my ($zw) = &jcode::euc('0-9A-Za-z');
  my ($hw) = &jcode::euc('0-9A-Za-z');
  my ($zg) = &jcode::euc('@!”#$%&’()=^¥|{}:;+*?_/<>.,-');
  my ($hg) = &jcode::euc('@!"#$%&\'()=^\\|{}:;+*?_/<>.,-');

  $str = &jcode::euc($str);
  &jcode::tr(\$str, $zw, $hw);
  &jcode::tr(\$str, $zg, $hg);

  return &jcode::sjis($str);
}
EUCかJISでないとならないようなのですが、
コードはWindowsで書いたので、Shift_JISです。
まぁ、そうでなくても明示的に文字列変数を
EUCにしておく事は意味があるでしょう。
あとは、trに文字列と、置換前の文字クラスと
置換後の文字クラスを渡してやれば成功です。
ただし、記号を書く場合の注意ですが、
マイナス(-)は、最後に書く必要があります。
これは、文字クラスの
範囲用のマイナスとの区別がつかないからだと思います。
つまり0-9と書いた場合、
数字を表すと思いますが、
この真ん中のマイナスとの区別がつかず、
正しく変換されません。
そのため、マイナス記号は文字列の最後に書きます。

|

« 半角のみの書き込みを許さないCGI | トップページ | サブルーチンの引数として配列を渡す Perl »

Perl」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: 半角/全角の変換:

« 半角のみの書き込みを許さないCGI | トップページ | サブルーチンの引数として配列を渡す Perl »