[pgsql-jp: 25212] Re: Windows上JDBC でのエンコーディング

TANAKA Yoshihiro ytp @ vc-net.ne.jp
2002年 3月 11日 (月) 10:46:39 JST


田中 良浩 です。

書き忘れがありました。m(_~_)m

Connectionクラスには石井さんから教えていただいた
getdatabaseencoding()
↓
pg_client_encoding()
の修正を入れてます。


On Mon, 11 Mar 2002 10:36:44 +0900
TANAKA Yoshihiro <ytp @ vc-net.ne.jp> wrote:

>田中 良浩 です。
>
>★Javaでない皆さんには申し訳ありません。
>
>On Mon, 11 Mar 2002 09:02:28 +0900
>Tsunehisa Kazawa <kazawa @ sons.co.jp> wrote:
>
>>加澤と申します。横からすみません。
>
>初めまして、よろしくお願いします。
>
>>Java を使って開発を行っている者としての意見です。
>
>文字化けの経験はお持ちですか?
>
>>YTP wrote:
>>> 田中良浩 です。
>>[省略]
>>> 最初に結論を申し上げますと、
>>> Postgreが提供するJDBCの内部でのデコードは、
>>> プラットフォームに合わせたデフォルトエンコーディングを使って
>>> 処理するようにはできないでしょうか、ということなんです。
>>> (現状では、サーバ上のエンコーディング指定で決め打ちしている
>>> ように見え、結果的にSJISになってしまうと思います)
>>
>>これは逆ではないでしょうか?RDBMS のようにさまざまなシステム、
>>OS から利用されることが想定されるようなシステムでは、クライア
>>ントサイドのデフォルトエンコーディングは使うべきではないと思い
>>ます。EUC-JP などとの相互変換のことを考えても SJIS コンバータ
>>固定の方が設計として望ましいのでは?
>
>RDB内データのエンコーディングのことではありません。
>そこから読んで来たデータをアプリケーションに渡す時の話です。
>
>論より証拠ですよね...
>実験してみました。
>
>■環境(最初のメールと同じ)
>・サーバ
>  +TurboLinux 6.0
>  +PostgreSQL7.2
>  +initdbは"EUC_JP"で設定 ★
>・クライアント
>  +Windows2000 Professional
>  +JDK1.4
>  +JDBCドライバはhttp://jdbc.postgresql.org/download.html から入手
>   (7.2対応版)
>
>■DBエンコーディング
>        List of databases
>   Name    |  Owner   | Encoding
>-----------+----------+----------
> begin     | postgres | EUC_JP
> 
>■コンソールエンコーディング
>export PGCLIENTENCODING=SJIS
>
>■DB
>begin=> select * from product;
> pcode |     pname      | price
>-------+----------------+-------
> P001  | カーネーション |   120
> P002  | かすみ草       |    80
> P003  | バラ           |   180
> P004  | 桃の花         |   480
> P999  | 東京〜新大阪   | 12160
>(5 rows)
>上記は、TeraTermの設定をSJISにして採取
>★当然ですがこの時点で文字化けはありません。
>
>■テストプログラム
>package ytp.test;
>
>import java.sql.*;
>import java.util.*;
>
>public class TestPostgre {
>    private Connection con_ = null;
>    private Statement stmt_ = null;
>    
>    public static void main(String[] args) {
>        TestPostgre test = new TestPostgre();
>        test.test(args);
>    }
>    
>    public void test(String[] args) {
>        try {
>            Class.forName("org.postgresql.Driver");
>            con_ = DriverManager.getConnection(
>                  "jdbc:postgresql://atak:5432/begin", "ytp", "");
>            System.out.println("encoding on PC="
>             + ((org.postgresql.Connection)con_).getEncoding().name());
>            stmt_ = con_.createStatement();
>            ResultSet rs = stmt_.executeQuery("select * from product");
>            
>            while (rs.next()) {
>                System.out.println(rs.getString("pname"));
>            }
>            stmt_.close();
>            con_.close();
>        } catch (Exception e) {
>            e.printStackTrace();
>        }
>    }
>}
>
>■テスト結果(文字化け)
>C:\Source\Java>java ytp.test.TestPostgre
>dbEncoding=SJIS encoding=SJIS
>encoding on PC=SJIS
>カーネーション
>かすみ草
>バラ
>桃の花
>東京?新大阪
>
>■Encodingクラスの修正
>org.postgresql.core.Encodingクラスの
>encodings.put("SJIS", new String[] { "SJIS" });
>を  ↓
>encodings.put("SJIS", new String[] { "MS932" });
>に変更します。
>
>C:\Source\Java>javac org\postgresql\core\encoding.java
>
>C:\Source\Java>java ytp.test.TestPostgre
>dbEncoding=SJIS encoding=MS932
>encoding on PC=MS932
>カーネーション
>かすみ草
>バラ
>桃の花
>東京〜新大阪
>
>C:\Source\Java>
>
>※尚、テスト結果の表示でエンコーディングタイプを表示しているのは
>ConnectionクラスでDBサーバのエンコーディングを取得した後に
>String dbEncoding = resultSet.getString(2);
>encoding = Encoding.getEncoding(dbEncoding, info.getProperty("charSet"));
>→System.out.println("dbEncoding=" + dbEncoding + " encoding=" + encoding.name());
>と入れています。
>
>いかがですか、"SJIS"エンコーディングだと化けますよね?
>Javaな方にはご自分の環境で確認していただければ、と思います。
>
>★メールをいただいても、本日は仕事の都合で
>私から返信出来ないかもしれません。
>申し訳ありませんが後日返事させていただきます。
>------------------------------------
>      田中 良浩(TANAKA Yoshihiro) / 日本インターシステムズ(株)
>      E-mail:tanakay @ nisz.co.jp  -------------------------------
>
>
>
>

------------------------------------
      田中 良浩(TANAKA Yoshihiro) / 日本インターシステムズ(株)
      E-mail:tanakay @ nisz.co.jp  -------------------------------






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