■Windows版Perlの細道・けもの道

■ナビゲータ

[南北館(最初のメニュー)]

  1. [Windows版Perlの細道・けもの道]
    1. [1.準備編]
    2. [2.基本編]
    3. [3.応用編]
      1. [3-1.固定長データとCSVデータとの変換]
      2. [3-2.重複データの処理]
      3. [3-3.フォルダ内の一括処理]
      4. [3-4.1つのファイルを複数のファイルに分割する]
      5. [3-5.文字コードの変換]
      6. [3-6.半角全角変換]
        1. [3-6-1.半角カタカナを全角カタカナに変換する(JPerl.exe利用)]
        2. [3-6-2.半角カタカナを全角カタカナに変換する(Encodeモジュール利用)]
        3. [3-6-3.半角カタカナを全角カタカナに変換する(Jcodeモジュール利用)]
        4. [3-6-4.半角文字を全角文字に変換する(Unicodeモジュール利用)]
        5. [3-6-5.全角カタカナを半角カタカナに変換する(JPerl.exe利用)]
        6. [3-6-6.全角カタカナを半角カタカナに変換する(Encodeモジュール利用)]
        7. [3-6-7.全角カタカナを半角カタカナに変換する(Jcodeモジュール利用)]
        8. [3-6-8.全角文字を半角文字に変換する(Unicodeモジュール利用)]
      7. [3-7.多次元配列の処理]
      8. [3-9.その他]
    4. [スクリプトと入力データのサンプル]
rubyではどう処理する?
同じことをrubyではこうしています。

3.応用編

3-6.半角全角変換

3-6-2.半角カタカナを全角カタカナに変換する(Encodeモジュール利用)

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::h2z(\$temp);"で半角カタカナを全角カタカナに変換しています。ただし、項目に含まれる半角スペースは変換されずにそのままになっている点に注意してください。

実際に応用する場合は、入出力データのファイル名等を変更するとともに、半角カナ文字がある項目(下記では3番目の項目にしている)を指定して、利用します。

【スクリプト】
# h2zkana2.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 h2zkana2.pl   
#   

open(IN1,"input_sjis.txt"); 
open(OUT1,">output_sjis.txt");   

use Encode 'from_to';   
use Encode::JP::H2Z;    

while   ($line1 =   <IN1>)  {   
    chomp($line1);  

# 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::h2z(\$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::h2z(\$temp);   
# eucからshift-jisに変換する    
    from_to($temp, 'euc-jp', 'shiftjis');   
   

半角文字を全角文字に変換する"Encode::JP::H2Z::h2z"関数は変換する文字コードが"euc-jp"でなければならないので、事前に"from_to"関数で文字コードを"euc-jp"に変換しておきます。"from_to"関数はfrom_to(変換する文字列, 変換前の文字コード, 'euc-jp');のように指定します。

また、半角文字から全角文字に変換した後、出力用の文字コードに変換しますので、同じように"from_to"関数で文字コードを出力用の文字コード変換しておきます。"from_to"関数はfrom_to(変換する文字列, 'euc-jp', 変換後の文字コード);のように指定します。

なお、"Encode::JP::H2Z::h2z"関数では変換する文字列を<参照渡し>("\"をつけて指定する)にしている点に注意してください。

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 ジョン・スミス
    



Copyright (c) 2011-2013 Mitsuo Minagawa, All rights reserved.