[Kakasi-dev 25] Text::Kakasi::do_kakasi で分かち書きを行った際に文字化けが起こることがある問題について

amatubu amatubu @ users.sourceforge.jp
2005年 5月 31日 (火) 22:17:24 JST


こんにちは、はじめまして。いいむらと申します。

私は POPFile というメールフィルタの日本語化をさせて
いただいているのですが、その日本語処理の部分において
Kakasi(Text::Kakasi)を利用させていただいています。
有用なソフトウェアの提供、ありがとうございます。

さて、この POPFile のメール処理の中で、パフォーマンス
を向上させるために Kakasi の使用方法を変更してみた
ところ、問題に行き当たってしまいました。なにかよい
対処方法があればと思い、メールさせていただきました。

これまで、分かち書きを行うたびに Kakasi の辞書を開い
たり閉じたり(getopt_argv と close_kanwadict を呼ぶ)
を繰り返していたのですが、これを、一度パラメータを
設定して辞書を開いた後、しばらくの間はそのままの状態
で分かち書きを行い、それから辞書を閉じるというような
形に変更しました。
すると、ある特定のメール(文字)を処理したときに、
分かち書き後のテキストが文字化けしてしまうという問題
が発生してしまったのです。

そこで、問題の原因究明のためにあれこれ調べてみました
ところ、下記のようなプログラムを実行すると必ず症状が
再現することがわかりました(euc-jp で保存)。

---
#!/usr/bin/perl

use strict;

use Text::Kakasi;

init_kakasi();

kakasi_test();

close_kakasi();


sub kakasi_test {
    my $line;

    $line = "薔薇";

    print "$line\n";

    $line = Text::Kakasi::do_kakasi($line);

    print "$line\n";

    $line = "Kakasiの分かち書きで問題が起こる文字があるようです。";

    print "$line\n";

    $line = Text::Kakasi::do_kakasi($line);

    print "$line\n";
}

sub init_kakasi
{
    require Text::Kakasi;

    Text::Kakasi::getopt_argv("kakasi", "-w -ieuc -oeuc");
}

sub close_kakasi
{
    require Text::Kakasi;

    Text::Kakasi::close_kanwadict();
}
---

上記の例では、「薔薇」という特定の文字列の分かち書きを
行ったあとで他の文字列の処理をしようとすると、途中から
文字化けが発生してしまいます。また、「薔薇」自体も
「薔 薇」と分割されてしまいました。
不思議なことに、「これは薔薇です」であれば、「これは 
薔薇 です」と正しく分かち書きが行われ、そのあとに文字
化けは起こりません。「薔薇です」の場合は文字化けが
起こります。

他の文字でも試してみたところ、どうも euc-jp での文字
コードの 1 バイト目が「Ex」となっている文字が最初に
あると問題が起こるような感じです(それだけが原因か
どうかもわかりませんが)。
この問題を解決するよい方法はないでしょうか。

よろしくお願いします。

動作環境
・Mac OS X 10.3.9
・Perl 5.8.1
・Kakasi 2.3.4
・Text::Kakasi 1.04

-- 
/* ======================================
      naoki iimura (amatubu / sent)
  E-mail: amatubu @ mac.com
  Home  : http://d.hatena.ne.jp/amatubu/
 ====================================== */



Kakasi-dev メーリングリストの案内