ActivePerlでEncodeモジュールを利用して、全角カタカナを半角カタカナに変換する方法です。
EncodeモジュールはActivePerlでは通常のインストールでインストールされていますので、"use Encode"とするだけで利用できるようになります。下記の例で、"use Encode 'from_to'"としているのは、Encodeモジュールの中の"from_to"関数を使うという指定です。この指定をすると、スクリプトの中では、単に"from_to()"だけで実行できます。仮に、"use Encode"とだけ指定した場合は、"Encode::from_to()"とすれば、同様の処理ができるようになります。
Encodeモジュールでの文字コードはeucですので、"from_to"関数でeucに変換してから、"Encode::JP::H2Z::z2h(\$temp);"で全角カタカナを半角カタカナに変換しています。
なお、項目に含まれる全角スペースは変換されずにそのままになっている点にも注意してください。ただし、全角の「・(なかぐろ)」は半角の「・(なかぐろ)」に変換されます。
実際に応用する場合は、入出力データのファイル名等を変更するとともに、全角カナ文字がある項目(下記では3番目の項目にしている)を指定して、利用します。
# z2hkana2.pl
# 内容 : 全角カナを半角カナに変換する
# 前提 : 入力ファイルはshift-jis(from_to関数の引数を変えれば、utf8,eucでも可)
# スクリプトはshift-jis,utf8,eucどれでも可
# 通常のperlで動作可能
# Copyright (c) 2011 Mitsuo Minagawa, All rights reserved.
# (minagawa@fb3.so-net.ne.jp)
# 使用方法 : c:\>perl z2hkana2.pl
#
open(IN1,"input_sjis.txt");
open(OUT1,">output_sjis.txt");
use Encode 'from_to';
use Encode::JP::H2Z;
while ($line1 = <IN1>) {
# CSV形式の $line1 から値を取り出して @in1 に入れる
chomp($line1);
$line1 =~ s/(?:\x0D\x0A|[\x0D\x0A])?$/,/;
@in1 = map {/^"(.*)"$/ ? scalar($_ = $1, s/""/"/g, $_) : $_}
($line1 =~ /("[^"]*(?:""[^"]*)*"|[^,]*),/g);
# CSVファイルの3番目の項目が半角カタカナの項目とする。
$temp = $in1[2];
# shift-jisからeucに変換してから
from_to($temp, 'shiftjis', 'euc-jp');
# 全角文字を半角文字に変換し、
Encode::JP::H2Z::z2h(\$temp);
# eucからshift-jisに変換する
from_to($temp, 'euc-jp', 'shiftjis');
$in1[2] = $temp;
$out1 = join("\t",@in1);
print OUT1 "$out1\n";
}
close(IN1);
close(OUT1);
Encodeモジュールのfrom_to関数について解説します
# shift-jisからeucに変換してから
from_to($temp, 'shiftjis', 'euc-jp');
# 全角文字を半角文字に変換し、
Encode::JP::H2Z::z2h(\$temp);
# eucからshift-jisに変換する
from_to($temp, 'euc-jp', 'shiftjis');
半角文字を全角文字に変換する"Encode::JP::H2Z::z2h"関数は変換する文字コードが"euc-jp"でなければならないので、事前に"from_to"関数で文字コードを"euc-jp"に変換しておきます。"from_to"関数はfrom_to(変換する文字列, 変換前の文字コード, 'euc-jp');のように指定します。
また、半角文字から全角文字に変換した後、出力用の文字コードに変換しますので、同じように"from_to"関数で文字コードを出力用の文字コード変換しておきます。"from_to"関数はfrom_to(変換する文字列, 'euc-jp', 変換後の文字コード);のように指定します。
なお、"Encode::JP::H2Z::z2h"関数では変換する文字列を<参照渡し>("\"をつけて指定する)にしている点に注意してください。
from_to関数の文字コード
"from_to"関数では文字コードは以下のように指定します。
| 文字コード | 内 容 |
| utf8 | unicodeを表す文字コードの一種。Perl5.8以降、Perlの内部では、文字列はutf8で扱われています。 |
| euc-jp | 主にUNIXなどで利用されている文字コード。eucjp,ujis,jp-eucなどと指定しても可 |
| shift_jis | 主にWindowsで利用されている文字コード。shiftjis,sjisなどと指定しても可 |
| cp932 | 主にWindowsで利用されている文字コード。shift_jisに機種依存文字を含んだもの。一般にはshift_jisと指定するよりは、こちらで指定した方が変換エラーは発生しにくくなります。windows-31jと指定しても可 |
| 7bit-jis | ASCII文字が割り当てられているコードに、半角カタカナを割り当て、エスケープシーケンス等によって、半角カタカナモードに切り替えるものです。 bjisと指定しても可 |
| iso-2022-jp | いわゆる「JIS漢字コード」です。 |
| iso-2022-jp-1 | いわゆる「JIS漢字コード」に「JIS補助漢字」を追加したものです。 |
| MacJapanese | shift_jisにAppleコンピュータ用の機種依存文字を含んだものです。 |
スクリプトはこちらにあります(必ずshift_jisで保存してください)。
入力データはこちらにあります(必ずshift_jisで保存してください)。
"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 ジョン・スミス