今日のPerl(息抜き)

会社から貸与された新しい機種のPHS端末。まったく電話帳が入っておらず、以前の機種からの引継ぎも出来ないとのことでイライラ。社員の情報は ActiveDirectory で管理されているはずなので、LDAP から名前と電話(内線/外線)番号、メールアドレス等の情報を引っ張ってこれることを思い出し、ついカッとなって PHS 端末にインポート可能な形式の csv を生成する Perl スクリプトをデッチアップすることに。

まず引っかかったのが、携帯の電話帳に必須の「読み仮名」をどうしようかということ。読みが仮名で入っていないと、うまく電話帳検索の自動分類が働かないのでやっぱり対応必須だろう。だけど LDAP から「読み仮名」は取得できない。というわけで、ローマ字表記名をカナに変換できないかと Lingua::JA::Romaji を評価していたのですがイマイチうまく動かない。とりあえず時間も無いので断念。

続いて Dan Kogai さん作Lingua::JA::Kana を使ったらイイ感じ!!……と思ったんだけど、

「Junko」さんが 「Jウンコ」さんになってしまった

ため泣く泣く保留。 Lingua::JA::Romanize::* ってどうなんだろう。仮名->ローマ字のみかな?今度調べよう。

次に難字問題。にぽたん研究所:難字に難儀 にあるとおり、cp932 -> euc-jp でうまく変換できない文字がある。俗に言う「ハシゴ高」とかの難字。数字、カタカナなどを半角変換するために Encode::H2Z::z2h を使う場合、入力は euc-jp になるため、一度 euc-jp を経由してしまうので難字が化けてしまう。さらに、この難字を問題が出ない異字体に変換する Lingua::JA::Regular があるが、これも nipotan さんの先のエントリにあるとおり、内部で Jcode を経由するので「〓」(ゲタ文字)になってしまったりとちょっとクセがある。

そこでとりあえず nipotan さんが 30 分もかけ苦労して作成されたという Shift_JIS 用の %KANJI_ALT_TABLE を南無南無とありがたく使わせていただき、

my $enc = Encode::find_encoding('cp932');
my $string = $enc->encode($string);
my ($key, $value);
while ( ($key, $value) = each(%KANJI_ALT_TABLE_SJIS) ) {
   $sjis =~ s/$key/$value/ge;
}
Encode::from_to($string, 'cp932', 'euc-jp');
Encode::JP::H2Z::z2h(\$string);
Encode::from_to($string, 'euc-jp', 'cp932');

ってな感じでお茶を濁して終了。無事端末にインポート可能な csv を生成することが出来た。 今日の息抜きはここまで。

Similar Posts: