Perlでの全角半角変換

最終更新日時:2009-07-06 19:03:52
Perl

Perlを使って英数字記号およびカタカナの全角/半角の変換を行う時のメモ。
というか、いまいちスッキリしなかったので、途中経過としての記録。

Jcode


一番スタンダードなのがJcodeを使う方法。
特に、Perl-5.6以前はJcode.pmもしくはjcode.plを使うのが定石で、現状でも古いコードを保守する際には非常に重宝する。
ただし、Jcodeは内部コードがeuc-jpであることが前提として作られているせいか、utf8でtr等を使用するとうまく変換されない。
従って、内部コードがutf8となったPerl5.8以降では、もはや主流からは外れていると行って良いと思う。

使用例:

 require 'jcode.pl';
 jcode::tr(\$str, '0-9A-Za-z', '0-9A-Za-z');


tr


Perl-5.8以上であれば、utf8の文字列は普通に全角でもtrで変換できる。
ただし、明示的にuse utf8しないと動作しないのと、use utf8するので出力時にはbinmodeで明示的にutf8を指定しないといけないので少々面倒。
さらに、半角カナには対応していないので、半角カナに対応するには別途モジュール等が必要。

使用例:

 use utf8;
 binmode STDOUT, ":utf8";
 $str =~ tr/0-9A-Za-z/0-9A-Za-z/;
 print $str;


Unicode::Japanese


本当は、軽量なLingua::JA::Regular::Unicodeの方が良いと思うが、個人的にはUnicode::Japaneseが現状では一番使いやすいと思うので、何も考えずにUnicode::Japaneseを使っています。

使用例:

 use Unicode::Japanese;
 print Unicode::Japanese->new($str)->z2h->get;


Lingua::JA::Regular::Unicode


全角/半角の変換に特化したモジュールなので、非常に軽量。
現状、これがスタンダードといってよいと思うのだが、このモジュールもuse utf8;しないと動作しないのが少々面倒。
※この点はドキュメントには書かれていないように見える。
また、ドキュメントによると、以下のようにuseされているが、Version-0.03時点では、実際にこのように指定するとエラーとなる。

 use Lingua::JA::Regular::Unicode qw/regular/;


使用例:

 use utf8;
 use Lingua::JA::Regular::Unicode qw/alnum_z2h/;
 binmode STDOUT, ":utf8";
 print alnum_z2h($str);


お問い合わせは 掲示板 にて。