[pgsql-jp: 25195] JDBCドライバ(7.2)でのエンコーディング判断障害

YTP ytp @ vc-net.ne.jp
2002年 3月 10日 (日) 01:36:00 JST


初めまして、田中 良浩 と申します。

最近PostgreSQLを使い出しました。(2日目です)
JDBCドライバを使って次の環境で評価していましたが、
日本語エンコーディングの判断に障害が見られるようなので
報告します。

※既知の障害あるいは私の設定ミスが考えられる場合は
  ご指摘下さい。
  また、バグ報告などの宛先等ご教示下されば幸いです。

■環境
・サーバ
  +TurboLinux 6.0
  +PostgreSQL7.2
  +initdbは"EUC_JP"で設定 ★
・クライアント
  +Windows2000 Professional
  +JDK1.4
  +JDBCドライバはhttp://jdbc.postgresql.org/download.html から入手
   (7.2対応版)

■概要
サーバ側の環境変数PGCLIENTENCODINGに"SJIS"を設定した場合、
JDBCがストリームから取得しているデータのコード体系は
シフトJISになっているのにもかかわらず、
エンコーディング情報が"EUC_JP"のままであるため
文字化けを起こします。

■詳細
1)DBのエンコーディングはEUC_JP
        List of databases
   Name    |  Owner   | Encoding
-----------+----------+----------
 begin     | postgres | EUC_JP

2)サーバ側postgresユーザの環境変数PGCLIENTENCODINGはSJIS

3)org.postgresql.core.Encoding#decode(byte[], int, int)
  に次のトレースを入れ実行
for (int i = 0; i < encodedString.length; i++) {
    System.out.print(" " + Integer.toHexString(0x000000ff &
        (int)encodedString[i]));
}
System.out.println("\n" + encoding);
return new String(encodedString, offset, length, encoding);

4)表の列に'桃の花'という値がある場合

a)PGCLIENTENCODING=SJIS の場合のトレース
 93 8d 82 cc 89 d4  (★シフトJISになっている)
EUC_JP

b)PGCLIENTENCODING=EUC_JP の場合のトレース
 c5 ed a4 ce b2 d6
EUC_JP


■障害の原因と思われる箇所
上記トレースにあるencodingは、
org.postgresql.Connection#openConnection()の中で
次の命令によって取得しています。
set datestyle to 'ISO'; select version(), 
  case when pg_encoding_to_char(1) = 'SQL_ASCII'
  then 'UNKNOWN' else get

※結果
                           version                           | getdatabaseencoding
-------------------------------------------------------------+---------------------
 PostgreSQL 7.2 on i586-pc-linux-gnu, compiled by GCC 2.95.2 | EUC_JP

このため、ストリームから実際に取得しているデータは
シフトJISであるのにもかかわらず、
JavaのStringに変換する際にはエンコーディングタイプをEUC_JP
としてnewするために文字化けが発生しています。

■対応案
サーバから送られて来るデータがシフトJISでなので、
そのエンコーディング名を取得するように変更する
必要があると思われます。
またはその逆で、PGCLIENTENCODINGの値に関係なく
DBのエンコーディングでサーバ側が送信すると
いうように変更するか、です。


★その他気になったこと
org.postgresql.core.Encodingクラスの中で設定されている
エンコーディング名に"MS932"が見当たりません。(SJISはあります)
ご存じのようにJDK1.2以降、Windowsでのデフォルトエンコーディングは
"MS932"になっています。
このあたりの対応をうまく行わないと、「〜」などの文字が
化ける原因になるのではないかな、と思いました。

DB側のエンコードでSJISの指定が不可能ならば
MS932<->SJISでの問題は現状起きませんが、
Windows版PostgreSQLもあるようなので(私は未使用)
少し心配です。
------------------------------------
      田中 良浩(TANAKA Yoshihiro) / 日本インターシステムズ(株)
      E-mail:tanakay @ nisz.co.jp  -------------------------------





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