[ トップページ ]
数学・計算・情報学・プログラミング:プログラミングとコンパイラ

ひさしぶりの Perl 日本語環境構築 ― まだ完全に成功してはいない…

ひさしぶりに Perl で日本語をあつかう環境を構築しようとしている. 12 年まえには会社で百科事典の検索の仕事をするために環境構築したが,そのときは Shift JIS コードないし EUC JP コードをあつかった. 今回は UTF-8 コード中心の環境をつくることになるが,周囲にはまだ UTF に完全に対応しきれていない環境やプログラムなどがいろいろあり,なかなかうまく構築できずにいる.

まず OS として Windows をつかうか Linux をつかうかという問題がある. Windows をつかうなら,UTF のつかいやすさでは Windows Vista がよいだろう. しかし,Perl をつかうとなると,Vista の恩恵はあまりうけられない. エディタとしては Emacs をつかうが,これは現在つかっている ver 22.2 でだいたい UTF にうまく対応している.

ところが,Perl のハッシュでデータベースにアクセスしようとすると,Perl に本来はくみこまれているはずの Berkeley DB (DB_File) がくみこまれていないということが問題になる. Perl では数種類のデータベースをあつかうことができるはずだが,Windows 版の Perl としてもっとも有名な ActivePerl では SDBM という低機能のものしかつかえない.

ActivePerl より Strawberry Perl というのがよいと Web 上にかかれていて,かつ DB_File をインストールする方法もかいてあるので,Strawberry Perl をつかってみた. 「strawberry perl に DB_File モジュールをインストールする方法」 にしたがって DB_File をインストールすると,たしかに一応はつかえるようになった. ところが,おなじことを CGI でやろうとすると,うまくうごかない. 原因はわかっていないが,標準サポートのはずのものがはいっていないのはそれなりの理由があるのだろうから,こんなにかんたんにその問題が解決できるわけではないのだろう.

それでは,というので Linux をためしてみる. まずはて,もとにある Fedora Core 5 のうえでためしたみた. データベースに関しては,DB_File をつかったのでは UTF-8 がうまくあつかえないことがわかった. また,まだ UTF-8 への対応が不完全なので,Emacs などがテキストをうまく表示できず,ぐあいがわるかった.

そこで,Fedora Core 5 をそのままつかうことはあきらめて,最新版の Fedora をつかってみることにした. 最新版は 11 だったので,それをインストールした. ところが,Fedora Core 5 で動作したファイルをこの環境にもってきても異常な結果がえられる. 登録されているはずのハッシュ表が空になってしまう.

エラーが報告されずに結果が不正になるのは Perl に問題があるとかんがえられる. しかし,さらに追及した結果,SELinux がアクセスを拒否したことが原因だとわかった. 外部からアクセスしているわけではないのでよけいなお世話なのだが,SELinux は GUI メニューの 「ファイアウォール」 でファイアウォールを無効化したつもりでもはたらきつづける. 「SELinux Management」 で 「システムデフォルトの強制モード」 と 「現在の強制モード」 をともに 「許容」 にするのがもっともかんたんな解決策のようだ. こうすれば SELinux はアクセスを検出するが記録だけとって許容する. ファイアウォールのほうは無効にする必要はなくて,単に TCP ポート 80 をあける設定をするだけでよい. これで当然,ほかのマシンからもアクセスできるようになる.

これで一応,だいたいの表示はできるようになったが,実は文字コード問題はまだ解決していない. Berkeley DB そのものは UTF-8 をうけつけるはずだが,Perl の DB_File をつかうと UTF-8 があつかえないようだ. 現在は DB_File にかきこむときに EUC JP コードに変換しているが,これでは EUC JP にない文字はただしくあつかわれない. DB_File パッケージはふるくからのインタフェースだが,Berkeley DB のあたらしい機能をつかうための BerkeleyDB というパッケージがあるので,それをつかうなどして,この問題を解決する必要がある.

2009-8-22 追記:
問題はどうやらだいたい解決されたが,その後,結局はデータベースをつかうと処理がおそくなるという理由で,単純なファイルをつかうようになった. それでもなお I/O 時の文字化けでなやまされたが,なんとか解決してつかっている. ひとことでいうと,プログラムの先頭につぎの宣言をいれるのが一番かんたんな解決策のようだ.

use open ":utf8";
use open ":std";

それでも入出力時には decode('utf8', ...), encode('utf8', ...) といった関数よびだしが必要になることがある (Perl でフォームデータから UTF-8 日本語文字をとりだす方法」 参照).

データベースがらみではその後 MySQL とのくみあわせもためしてみて,これまた,どちらも UTF-8 に対応しているはずなのに文字化けするという問題がおこっている. UTF はやはりやっかいだ.

キーワード: 文字コード, 漢字コード, ユニコード, UTF-8, Unicode, Perlデータベース

トラックバック

このエントリーのトラックバックURL:
http://www.kanadas.com/mt/mt-tb.cgi/4007

コメントを投稿

Google でブログを検索:

メインページアーカイブページも見てください.
Creative Commons License
このブログはつぎのライセンスで保護されています. クリエイティブ・コモンズ・ライセンス.
Powered by
Movable Type