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

TANAKA Yoshihiro ytp @ vc-net.ne.jp
2002年 3月 10日 (日) 12:02:22 JST


田中 良浩 です。

On Sun, 10 Mar 2002 10:04:43 +0900
Tatsuo Ishii <t-ishii @ sra.co.jp> wrote:

>石井です.

えっ? 石井さんて、あのシーラカンスの石井さんでいらっしゃいますか?
なんと、初めての投稿でそれは光栄です。
あの本を読みながら只今勉強中です。ほんとに助かってます。

★メールを書いている途中で谷田さんかの返信も届いたので
  併せて書かせていただきます。

>日本だとこのMLですが,英語がOKなら本家の(www.postgresql.org参照)が正式
>なバグ情報の送付先になります.

ありがとうございます。

>> このため、ストリームから実際に取得しているデータは
>> シフトJISであるのにもかかわらず、
>> JavaのStringに変換する際にはエンコーディングタイプをEUC_JP
>> としてnewするために文字化けが発生しています。
>> 
>> ■対応案
>> サーバから送られて来るデータがシフトJISでなので、
>> そのエンコーディング名を取得するように変更する
>> 必要があると思われます。
>> またはその逆で、PGCLIENTENCODINGの値に関係なく
>> DBのエンコーディングでサーバ側が送信すると
>> いうように変更するか、です。
>
>ほぼ田中さんの分析通りですが,これは既知の問題で,Connection.javaの328
>位からのコメントに書いてある通りです.

申し訳ありません、既知でしたか。

で、ご指摘の部分をもう一度読み直してみたんですが、
※私の持っているソース(7.2に付属のもの)では294行目
However it isn't easy to conditionally call this new
function, since we don't yet have the information as to what server
version we are talking to.
というコメントが間違っていると思うんです。
なぜならば、先のメールで書いたように

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

と、バージョンはちゃんと取れているようなので。
ここらあたりも既知と考えてよろしいでしょうか?

>対処方法ですが,7.1など,7.2よりも前のバージョンのPostgreSQLのサーバに
>接続する必要がなければ,342行目の
>"case when pg_encoding_to_char(1) = 'SQL_ASCII' then 'UNKNOWN' else
>pg_client_encoding() end";
>
>に変更すればOKです.

ありがとうございます。

>あるいはプロパティcharSetにSJISをセットしてもいけると思いますが,試し
>ていません.

はい、これはソースを追いかけていて見つけていました。

>> DB側のエンコードでSJISの指定が不可能ならば
>> MS932<->SJISでの問題は現状起きませんが、
>> Windows版PostgreSQLもあるようなので(私は未使用)
>> 少し心配です。
>
>PostgreSQLはDBエンコーディングにSJISやMS932は指定できません.

Windows版でもEUC_JPのみサポートということでしょうか?


>谷田です。

初めまして、よろしくお願いします。

>> ★その他気になったこと
>> org.postgresql.core.Encodingクラスの中で設定されている
>> エンコーディング名に"MS932"が見当たりません。(SJISはあります)
>> ご存じのようにJDK1.2以降、Windowsでのデフォルトエンコーディングは
>> "MS932"になっています。
>> このあたりの対応をうまく行わないと、「〜」などの文字が
>> 化ける原因になるのではないかな、と思いました。
>> 
>> DB側のエンコードでSJISの指定が不可能ならば
>> MS932<->SJISでの問題は現状起きませんが、
>> Windows版PostgreSQLもあるようなので(私は未使用)
>> 少し心配です。
>
>PostgreSQLは独自の変換エンジンを持っており、これがJavaのSJISエンコーディ
>ングとちゃんとマッチするので問題ないはずです。

申し訳ありません、私の言葉が足りなかったようです。
私が指摘したのは、シフトJISとUnicodeマッピングの問題です。

先のメールで書いた
org.postgresql.core.Encoding#decode(byte[], int, int)
の中の
return new String(encodedString, offset, length, encoding);
という部分ですが、この時にencodingの値が"SJIS"になっていると
問題が起き得ることを言いたかったんです。

この値を受け取ったアプリケーションが何かの理由で
エンコーディングを指定せず、つまりデフォルトエンコーディングである
"MS932"を使って再度変換をかけると、
Unicodeマッピングの違いにより「〜」などの一部の文字が化ける
現象が発生することを指しています。

※ご参考
http://www.vc-net.ne.jp/~ytp/bbs/java/bbs6043.html
http://www.ingrid.org/java/i18n/unicode.html
------------------------------------
      田中 良浩(TANAKA Yoshihiro) / 日本インターシステムズ(株)
      E-mail:tanakay @ nisz.co.jp  -------------------------------






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