ActivePerlでUnicodeモジュールを利用して、半角文字をすべて全角文字に変換する方法です。
UnicodeモジュールはActivePerlでは通常のインストールでインストールされていますので、"use Unicode::Japanese"とするだけで利用できるようになります。下記の例では半角文字をすべて全角文字に変換していますが、"Unicode::Japanese->new($temp)->h2z->get;"の"h2z"の部分を変えると、半角カタカナだけの変換などができるようになります。どのように変換されるかは下記の例を見てください。
【2013/4/9追記】Unicodeモジュールの中にJapaneseモジュールが含まれていないことがあるようです。その場合は、こちらをダウンロードし、C:\Perl\lib\Unicode(またはC:\Perl64\lib\Unicodeなど該当するフォルダ)の配下に保存した後、解凍してください。
【2016/5/28追記】最近のバージョンでは、このスクリプトが実行できないようです。Active Perl 5.12、5.16、5.20で動作しないことを確認しました。
入力データ : []@!#$%&'()*+,-./ 012345ABCEFGabcefgアイウエオガザダバパヴ h2z : []@!#$%&'()*+,−./ 012345ABCEFGabcefgアイウエオガザダバパヴ h2zSym : []@!#$%&'()*+,−./ 012345ABCEFGabcefgアイウエオガザダバパヴ h2zNum : []@!#$%&'()*+,-./ 012345ABCEFGabcefgアイウエオガザダバパヴ h2zAlpha : []@!#$%&'()*+,-./ 012345ABCEFGabcefgアイウエオガザダバパヴ h2zKana : []@!#$%&'()*+,-./ 012345ABCEFGabcefgアイウエオガザダバパヴ h2zKanaK : []@!#$%&'()*+,-./ 012345ABCEFGabcefgアイウエオガザダバパヴ h2zKanaD : []@!#$%&'()*+,-./ 012345ABCEFGabcefgアイウエオガザダバパヴ
実際に応用する場合は、入出力データのファイル名等を変更するとともに、半角カナ文字がある項目(下記では3番目の項目にしている)を指定して、利用します。
# h2z_all.pl # 内容 : 半角文字(英数字、記号およびカナ)を全角文字に変換する # 前提 : 入力ファイルはUTF-8(BOMなし)、 # スクリプトはUTF-8(BOMなし)とすること # 通常のperlで動作可能 # Copyright (c) 2011 Mitsuo Minagawa, All rights reserved. # (minagawa@fb3.so-net.ne.jp) # 使用方法 : c:\>perl h2z_all.pl # open(IN1,"input_utf8.txt"); open(OUT1,">output_utf8.txt"); use Unicode::Japanese; while ($line1 = <IN1>) { # CSV形式の $line1 から値を取り出して @in1 に入れる chomp($line1); $line1 =~ s/(?:\x0D\x0A|[\x0D\x0A])?$/,/; @in1 = map {/^"(.*)"$/ ? scalar($_ = $1, s/""/"/g, $_) : $_} ($line1 =~ /("[^"]*(?:""[^"]*)*"|[^,]*),/g); #3番目の項目に半角文字があるものとする $temp = $in1[2]; #記号・英数字・カタカタをすべて全角文字に変換する $in1[2] = Unicode::Japanese->new($temp)->h2z->get; #記号のみを全角文字に変換する # $in1[2] = Unicode::Japanese->new($temp)->h2zSym->get; #数字のみを全角文字に変換する # $in1[2] = Unicode::Japanese->new($temp)->h2zNum->get; #英字のみを全角文字に変換する # $in1[2] = Unicode::Japanese->new($temp)->h2zAlpha->get; #カタカタのみを全角文字に変換する # $in1[2] = Unicode::Japanese->new($temp)->h2zKana->get; #カタカタ(濁音つき、半濁音つきを除く)を全角文字に変換する # $in1[2] = Unicode::Japanese->new($temp)->h2zKanaK->get; #カタカタ(濁音つき、半濁音つきのみ)を全角文字に変換する # $in1[2] = Unicode::Japanese->new($temp)->h2zKanaD->get; $out1 = join("\t",@in1); print OUT1 "$out1\n"; } close(IN1); close(OUT1);
スクリプトはこちらにあります(必ずutf8で保存してください)。
入力データはこちらにあります(必ずutf8で保存してください)。
"0100","ABC","[]@!#$%&<>'()*+,-./ 012345ABCEFGabcefgアイウエオガザダバパヴ" "0110","ABC","[]@!#$%&<>'()*+,-./ " "0120","ABC","0123456789" "0130","ABC","ABCEFGabcefg" "0140","ABC","アイウエオガザダバパヴ" "0150","ABC","カガ タダヒコ" "0160","ABC","スズキ ココロ" "0170","ABC","ジョン・スミス" "0200","DEF","[]@!#$%&<>'()*+,−./012345ABCDEFGabcdefgアイウエオガザダバパヴ" "0210","DEF","[]@!#$%&<>'()*+,−./ " "0220","DEF","0123456789" "0230","DEF","ABCDEFGabcdefg" "0240","DEF","アイウエオガザダバパヴ" "0250","DEF","カガ タダヒコ" "0260","DEF","スズキ ココロ" "0270","DEF","ジョン・スミス"
0100 ABC []@!#$%&’()*+,−./ 012345ABCEFGabcefgアイウエオガザダバパヴ 0110 ABC []@!#$%&’()*+,−./ 0120 ABC 0123456789 0130 ABC ABCEFGabcefg 0140 ABC アイウエオガザダバパヴ 0150 ABC カガ タダヒコ 0160 ABC スズキ ココロ 0170 ABC ジョン・スミス 0200 DEF []@!#$%&’()*+,−./012345ABCDEFGabcdefgアイウエオガザダバパヴ 0210 DEF []@!#$%&’()*+,−./ 0220 DEF 0123456789 0230 DEF ABCDEFGabcdefg 0240 DEF アイウエオガザダバパヴ 0250 DEF カガ タダヒコ 0260 DEF スズキ ココロ 0270 DEF ジョン・スミス