[pgsql-jp: 33962] UNICODEとEUC_JP用の新たなconversion

Tatsuo Ishii t-ishii @ sra.co.jp
2004年 9月 3日 (金) 15:56:27 JST


石井です.

ご存じのように,PostgreSQLでは,異なる文字コードの間で自動コード変換が
可能ですが,UNICODEとEUC_JP(SJIS)の間の変換はMS-932ベースになっていま
す.したがって,MS-932で統一されたシステムでは問題ありませんが,MS-932
ではなくてJISベースに準拠したシステムでは「〜」(JIS区点コードで2141,
UCS-2で301c)などの一部の文字が変換できない問題があります.

これはPostgreSQLの問題と言うよりも,各ベンダーでばらばらに定義された
Unicodeとその他の文字コードの変換表に互換性がないことによるもので,今
のところ対応方法としては,(JISも含め)ベンダーごとの変換表を別々に用い
るしかないようです.

幸いなことにPostgreSQLでは,7.3以降変換表(conversion)をユーザが定義で
きるので,この問題に比較的容易に対処できます... とはいうものの,なぜか
そういうものをどなたも作らないようなので,今回,とりあえず問題解決の第
一歩として,MS-932ではなく,JISに基づいてUnicode<-->EUC_JPの変換を行う
conversionを作ってみました.

こういうものを作るときは,ベースとなる変換表に何を用いるかが問題ですが,
とりあえず今回は
http://www.unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/ を使いました
"OBSOLETE"っていうのが気になりますが,他にいいデータが見つからなかった
もので...

また,この表にはベンダー定義の文字が含まれていないので,そういうのは全
部エラーになります.

# http://www.opengroup.or.jp/jvc/cde/appendix.html でやっている方もい
# るようです.

インストールは簡単で,基本的にcontribモジュールと同じ作りになっている
ので,PostgreSQLのソースツリーのcontribの下に展開し,make;make install
するだけです.

既存のconversionを置き換えてしまって構わない場合は,その後

DROP CONVERSION pg_catalog.euc_jp_to_utf_8;
CREATE CONVERSION pg_catalog.euc_jp_to_utf_8 FOR 'EUC_JP' TO 'UNICODE' FROM euc_jp_to_utf8;
CREATE DEFAULT CONVERSION pg_catalog.euc_jp_jis_to_utf_8 FOR 'EUC_JP' TO 'UNICODE' FROM euc_jp_jis_to_utf8;
DROP CONVERSION pg_catalog.utf_8_to_euc_jp;
CREATE CONVERSION pg_catalog.utf_8_to_euc_jp FOR 'UNICODE' TO 'EUC_JP' FROM utf8_to_euc_jp;
CREATE DEFAULT CONVERSION pg_catalog.utf_8_to_euc_jp_jis FOR 'UNICODE' TO 'EUC_JP' FROM utf8_to_euc_jp_jis;

を実行すればdefault conversionが置き換わるので,JISベースの変換がサポー
トされるようになります(元々のMS-932ベースのconversionも残っているの
で,いつでも戻せます).

当然のことながら,これをやってしまうとEUC_JPに関してはMS-932ベースの変
換ではなくなるので,たとえばすでにUNICODEのデータベースにMS-932ベース
の変換で登録された「〜」(たぶんUCS-2で言うとff5eになっている)はEUC_JP
に戻せなくなります.

# ff52も301cもどちらも「〜」に変換するようにマップを定義すれば良いのか
# もしれないが,自信なし.

最後になりましたが,ものは
ftp://ftp.sra.co.jp/pub/cmd/postgres/conversion/utf8_and_euc_jp_jis.tar.gz
にあります.

よかったらお試し下さい.
--
Tatsuo Ishii



pgsql-jp メーリングリストの案内