[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 メーリングリストの案内