[pgsql-jp: 35056] Re: Windows の Tomcat4 と PostgreSQL8( EUC_JP)

tomson tomson_lpcjp @ yahoo.co.jp
2005年 3月 16日 (水) 13:51:54 JST


こんにちは。tomsonと言います。


不自然な点は、「拡張UNIXコードであるEUCを、Windows上のPostgresで用いて
いる、」という点です。

Windows日本語版の標準コードはSJISなので、
データベースはWINコードで作られているはずであり(たとえ、create
databaseでEUC-JPを指定していたとしても)、これにたとえ EUCエンコーディン
グされたデータをインポートしても、クエリーの中身の文字コードは SJISか、
UTF-8 であろう、と思われます。

Windows上でEUCを扱うと、何かと問題が生じやすいので、ご注意ください。

サポートされる文字コードは、以下を参照してください。
http://www.postgresql.jp/document/pg801doc/html/multibyte.html#MULTIBYTE-CHARSET-SUPPORTED

なので、

> SQLException: java.sql.SQLException: ERROR: invalid byte sequence for
> encoding "EUC_JP": 0xa53f

EUC_JPコードとしては、正しくない、というエラーが発生するのだと思われます
。
もしかしたら、UnicodeになってしまっているResultSetなどを、EUCに変換しよ
うとしていませんか?

create databaseするときに、何もエンコーディングオプションをつけずに、
あるいはEncodhing='WIN'として、作るか、

Encodhing='Unicode'

としてUnicodeのDBを作製するか、して試してみるのがよいのでは、と思います
。

もちろんインポートするデータも文字コードを変換しておかなければなりません
。


> > ちなみにDBはEUC_JP、JDBCドライバはpostgresql-8.0.309.jdbc3.jarを
> > 指定しています。

このドライバの文字コードを変換しているクラスのソースは以下のようになって
います。使用できる文字コードの一覧が御覧いただけます。



package org.postgresql.core;

import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.io.IOException;
import java.util.Hashtable;

public class Encoding{
private static final Encoding DEFAULT_ENCODING = new Encoding(null);

    /*
     * Preferred JVM encodings for backend encodings.
     */
    private static final Hashtable encodings = new Hashtable();

    static {
        //Note: this list should match the set of supported server
        // encodings found in backend/util/mb/encnames.c
        encodings.put("SQL_ASCII", new String[] { "ASCII", "us-ascii"
});        encodings.put("UNICODE", new String[] { "UTF-8", "UTF8" });
        encodings.put("LATIN1", new String[] { "ISO8859_1" });
        encodings.put("LATIN2", new String[] { "ISO8859_2" });
        encodings.put("LATIN3", new String[] { "ISO8859_3" });
        encodings.put("LATIN4", new String[] { "ISO8859_4" });
        encodings.put("ISO_8859_5", new String[] { "ISO8859_5" });
        encodings.put("ISO_8859_6", new String[] { "ISO8859_6" });
        encodings.put("ISO_8859_7", new String[] { "ISO8859_7" });
        encodings.put("ISO_8859_8", new String[] { "ISO8859_8" });
        encodings.put("LATIN5", new String[] { "ISO8859_9" });
        encodings.put("LATIN7", new String[] { "ISO8859_13" });
        encodings.put("LATIN9", new String[] { "ISO8859_15_FDIS" });
        encodings.put("EUC_JP", new String[] { "EUC_JP" });
        encodings.put("EUC_CN", new String[] { "EUC_CN" });
        encodings.put("EUC_KR", new String[] { "EUC_KR" });
        encodings.put("JOHAB", new String[] { "Johab" });
        encodings.put("EUC_TW", new String[] { "EUC_TW" });
        encodings.put("SJIS", new String[] { "MS932", "SJIS" });
        encodings.put("BIG5", new String[] { "Big5", "MS950", "Cp950"
});        encodings.put("GBK", new String[] { "GBK", "MS936" });
        encodings.put("UHC", new String[] { "MS949", "Cp949", "Cp949C"
});        encodings.put("TCVN", new String[] { "Cp1258" });
        encodings.put("WIN1256", new String[] { "Cp1256" });
        encodings.put("WIN1250", new String[] { "Cp1250" });
        encodings.put("WIN874", new String[] { "MS874", "Cp874" });
        encodings.put("WIN", new String[] { "Cp1251" });
        encodings.put("ALT", new String[] { "Cp866" });
        // We prefer KOI8-U, since it is a superset of KOI8-R.
        encodings.put("KOI8", new String[] { "KOI8_U", "KOI8_R" });
        // If the database isn't encoding-aware then we can't have
        // any preferred encodings.
        encodings.put("UNKNOWN", new String[0]);
        // The following encodings do not have a java equivalent
        encodings.put("MULE_INTERNAL", new String[0]);
        encodings.put("LATIN6", new String[0]);
        encodings.put("LATIN8", new String[0]);
        encodings.put("LATIN10", new String[0]);
    }




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