やりたいことはシンプルなのに、めんどい…
Perlで、全角数字を半角数字に変換したいのです。
すぐにできるとたかをくくっていましたが、意外とめんどくさい。他の箇所でEncode.pmを使っているのでEncodeのみで記述したかったのですが、残念ながらできなさそう。で、Jcodeを使えばよさそうなのですが、EUC-JPじゃないと全角文字がうまく扱えないのに、Shift_JISが使われています。がっでむ!
あまり時間かけるのも何なので、とりあえずやっつけ仕事的に以下のようなサブルーチンを定義しました。
use Encode; use Jcode; sub tr_z2h { my ($ref_str) = @_; my $zen = '0-9'; my $han = '0-9'; # 変換前処理(Jcode.pm の tr はEUC-JPを前提としているため) Encode::from_to($$ref_str, 'Shift_JIS', 'EUC-JP'); Encode::from_to($zen, 'Shift_JIS', 'EUC-JP'); Encode::from_to($han, 'Shift_JIS', 'EUC-JP'); # 全角⇒半角変換 $$ref_str = jcode($$ref_str)->tr($zen, $han); # 変換後処理 Encode::from_to($$ref_str, 'EUC-JP', 'Shift_JIS'); }
もっとスマートなやり方、誰か知らないかなぁ…と投げかけてみる。
ちなみに、どこでこういう問題が出てきたかというと、例のWalkerplusをGoogle Calendarに登録するというやつ。
2011 津花火大会(三重県・津市)| 花火大会 花火カレンダー - Walkerplusと第56回鳥羽みなとまつり(三重県・鳥羽市)| 花火大会 花火カレンダー - Walkerplusが拾われてなかったので原因を探ってみると、この2つのページだけ何故か全角数字が混じっていましたよorz
この修正を施して、あとはいくつか元ページの仕様変更に対応。
- 開始時間しか記載されていないものは、1時間後に終了すると仮定
- 「花火」という文字をセットして検索*1
*1:今まで検索フォームに空文字Submitで花火大会一覧を取得していたけれど、空文字だとエラーになるようになったので