やりたいこと

データベースなどで西暦→和暦変換したい(>ε<)


手作りだと…
・うるう年でバグ
・うるう秒でバグ
などがおこりやすい。

さらに、
1989/1/7 → 昭和64年1月7日
1989/1/8 → 平成 1年1月8日
など細かい。


そこで、環境に依存しないこのような関数を作りたい。

必要なもの

環境: CentOS 5

・ICU4C
・swig
・postgresql-devel
・postgresql-server
・postgresql-libs
・postgresql
・postgresql-pl


ICU4Cについては↓↓↓
ICU4C Linux インストール メモ - janeyの日記


その他は yum install でインストール。

インストール

ICU4C-func.tgzをダウンロードする。
http://briefcase.yahoo.co.jp/janey_dev
ここでは、和暦関数を作成するデータベース名をicudbとする

$ tar xf ICU4C-func.tgz
$ cd ICU/
$ ./configure
$ make
# make install
$ ./createFunc icudb

その他の関数

・ローマ字→ひらがな変換関数 l2h(text)
 text: ローマ字(例: hiragana)
・ローマ字→カタカナ変換関数 l2k(text)
 text: ローマ字(例: katakana)
・ひらがな→カタカナ変換関数 h2k(text)
 text: ひらがな(例: あいうえお)
・カタカナ→ひらがな変換関数 k2h(text)
 text: カタカナ(例: アイウエオ)
・半角→全角変換関数 half2full(text)
 text: 半角(例: abcde)
・全角→半角変換関数 full2half(text)
 text: 全角(例: ゼンカク)

考察

・PostgreSQL → ICU4C(C/C++)
 Postgresのユーザ定義関数を使って、関数を作成してみたがうまくいかなかった。
 Cのユーザ定義関数だとうまくいくが、C++の関数となるとメモリリークがおきたりするらしいです。


・PostgreSQL → Perl → ICU4C(C/C++)
 そこで、Perlを使ってみた。
 PostgreSQL → Perl : PL/Perl
 Perl → ICU4C(C/C++): SWIG
 

 こうするとうまくできました。
 SWIGの使い方は後でまとめよう。