[pgsql-jp: 28996] Re: 7.3.xのJDBC ドライバで,特定文字のみ文字化け

T.Suzuki t_suzuki @ kenwood-eng.co.jp
2003年 2月 10日 (月) 16:44:16 JST


お世話になっています。鈴木です。

> > 残念ながら,JDBCを入れ替えると文字化けが何故発生するかの原因は理解
> > 出来ませんでした.7.2用のJDBCとEUC-JPの組み合わせで動いていたのが偶然
> > だったのでしょうか….
> > (7.3.2で作成したJDBCは確実にUNICODEに変換した文字を返していました)
>
> ざっくりとJDBCのソースを読んでみました。
>
> 7.2のJDBCでは、DBの文字エンコーディングに合わせて、PostgreSQLとの
> 通信に使う文字エンコーディングを選択していました。鈴木さんの環境
> では、EUC_JPで通信していたと思います。
はい."initdb"の時にEUC-JPを指定しました.

> 7.3のJDBCでは、接続直後に "set client_encoding = 'UNICODE'" という
> SQLを実行して、PostgreSQLとの通信を強制的にUNICODEに変更して、通信に
> 使う文字エンコーディングも UTF-8 にしていました。
>
> org.postgresql.jdbc1.AbstractJdbc1Connection#openConnection()
> メソッドの、下の方の「haveMinimumServerVersion("7.3")」の部分です。
ソースを確認してみました.
ご指摘の通り,クライアントエンコーディングにはUNICODEが使用されていますね.
他にも,getString()でのエンコーディングが,UNICODEで行われるようになっている
のが分かりました.

> なんとなくですが、この辺りのUNICODE変換で、"−"や"〜"などの互換性が
> なくなる経路を通っているのではないかと、思います。

7.2のJDBCで,正しく動作していた時の状態を整理してみました.

DB       JDBC       Tomcat(JVM)          HTML
--------|------------|----------------------------|------------
EUC_JP → EUC_JP → EUC_JP:UNICODE:EUC_JP → EUC_JP

EUC_JPと,UNICODEの変換はServletのコンテナ部分を含めたJVMで行っている
様です.
憶測ですが,機種依存文字のエンコードMAPは,同じJVM上であった為問題がな
かったのかと思いました.

7.3のJDBCを使用して,正しく出力できた時と文字化けの環境は,以下の通りです.
  DB              JDBC       Tomcat(JVM)    
HTML
--------------------|------------|---------------------|------------
×EUC_JP:UNICODE → UNICODE → UNICODE:EUC_JP → EUC_JP
○EUC_JP:UNICODE → UNICODE → UNICODE:Shift_JIS → Shift_JIS

7.3より,JDBCで"set client_encoding = 'UNICODE'" を実行している事から
バックエンドとフロントエンド間での自動エンコーディング変換が使用されている
為,機種依存文字のエンコーディング箇所が,JVMとPostgreSQLの2箇所で行な
われています.
#UNICODE関連の知識不足の為,これ以上の具体的な問題点は分かりませんでした.

マニュアルを読み返してみると,UNICODEの変換テーブルは
"-enable-unicode-conversion "
の指定が必要との事で,再インストールを行ってみました.

参考: 5.2.4. ユニコードについて
http://osb.sra.co.jp/PostgreSQL/Manual/PostgreSQL-7.1-ja/multibyte.html#AEN1
3620

文字化けが発生していた環境に戻し実験しましたが,文字化けは相変わらず
発生します.
#JDBCは正しいUNICODE文字を返しているので,
#問題はServletコンテナか私の記述した処理の様です.

エンコーディング関連の経験が少ないので,はずしているかもしれません.
松田さん,情報ありがとうございました.
 -----------------------------------------
      鈴木 徹 (SUZUKI Toru)
      KENWOOD ENGINEERING CORPORATION
      E-mail:t_suzuki @ kenwood-eng.co.jp
 -----------------------------------------




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