Jcode.pmを使ってみるテスト
■ on ActivePerl 5.8.7.815
Windows XP上で、ActivePerl-5.8.7.815-MSWin32-x86-211909.msiでの動作を確かめる。
○サンプルスクリプト
#!/usr/local/bin/perl use lib '../lib'; use Jcode; @s =; $s = join "" , @s; Jcode::convert( ¥$s , 'utf-8' ); print $s; exit;
これで、Shift-JISのファイルを用意し、
>perl test.pl < test.txt > out.txt
で、変換されるout.txtのコードをエディタ(xyzzy)で確かめる。
Jcode.pmの開発者の Dan Kogai さんによるJcode.pm - jcode.pl の後継、Encode.pm への架け橋によれば、Perl 5.8.1以降は、標準ライブラリ Encode.pm に Jcode.pm の機能が盛り込まれており、Jcode 2.0 以降であれば、Jcode.pm をライブラリの直下に置けば使えるようになるとのこと。
そこで、上記サイトから、Jcode.pm をダウンロードして、'../lib'に置いて、上記プログラムを走らせてみると、すんなり通った。これはOK。
■ on @nifty
で、本番である。
ファイルの依存関係から、Jcode.pmを動かすために必要なファイル群は、「tomomori ってなんだあ?: Jcode.pm」に示されている。
@nifty の perl のバージョンは、5.00502 であり、5.8.7のモジュールだと、バージョンが高くて使えないものがあることから、動作実績がある ActivePerl 522 を使うことにした。これは、ActivePerlのサイトから、ダウンロード画面まで行ったところで、「Archive of older releases」のリンクで、http://downloads.activestate.com/ActivePerl/ へ飛び、 AP522_source.zip をダウンロードすると、lib ディレクトリの中にあります。
次に、Jcode.pm だが、現在のバージョンは2.03で、これを使ってみると、eucへの変換は出来るのだが、eucからutf8への変換が出来ない。そこで、旧バージョンである0.88を使うことにした。
この場合( ActivePerl 522 + Jcode-0.88 )でのディレクトリ構成。
/cgi-bin/ の下に lib/ を作り、その下に設置。 lib │ AutoLoader.pm │ Carp.pm │ DynaLoader.pm │ Exporter.pm │ integer.pm │ Jcode.pm │ overload.pm │ strict.pm │ vars.pm │ └─Jcode │ Constants.pm │ H2Z.pm │ Tr.pm │ └─Unicode Constants.pm NoXS.pm
なお、0.88でなくても、ここを参考に、Jcode::Unicode::NoXSのファイルの中で、以下の置き換えをすればOK。
- sub Jcode::をsub Jcode::_Classic::に
- &Jcode::を&Jcode::_Classic::に
なお、最終バージョン2.07の場合、必要なファイルは以下のとおり。
/cgi-bin/ の下に lib/ を作り、その下に設置。 lib │ AutoLoader.pm (標準ライブラリから) │ Carp.pm (標準ライブラリから) │ Exporter.pm (標準ライブラリから) │ integer.pm (標準ライブラリから) │ Jcode.pm │ overload.pm (標準ライブラリから) │ strict.pm (標準ライブラリから) │ vars.pm (標準ライブラリから) │ └─Jcode │ _Classic.pm │ Constants.pm │ H2Z.pm │ Tr.pm │ └─Unicode Constants.pm NoXS.pm 【上記変更が必要】
■ @niftyでPerl Moduleを使うときの注意点と、便利なこと
○検索パスの追加
requireやuseでパスが設定されていないときに検索するパスの追加で、
use lib './foo/bar/';
が使えないので、
BEGIN { push( @INC , './foo/bar'); }
とする。@INCは、requireやuseでの検索パスを示す特殊変数。
○エラーのトラック
@niftyでは、兎角エラーの内容がわかりにくいが、モジュール組み込み時に発生するエラーについては、
eval 'use HOGE;'; print $@;
として、eval関数でエラーが発生したときの戻り値で判断すると良いようだ。
■サンプルプログラム
とりあえずおいておく。
#!/usr/local/bin/perl BEGIN { push( @INC , '../lib'); } use Jcode; open( IN , "./test.txt" ); @s =; close IN; $s = join "" , @s; &Jcode::convert( ¥$s , 'utf8' ); print "Content-type: text/html; charset=utf-8¥n¥n"; print " ¥n"; print $s; print "¥n"; exit;