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

Tsunehisa Kazawa kazawa @ sons.co.jp
2002年 3月 11日 (月) 23:54:23 JST


加澤です。

TANAKA Yoshihiro wrote:
> 私の不勉強なんですが、そこでおっしゃる
> 「SJISにすべき」の意味をもう少し、詳しく教えていただけませんか?
> ストリーム上→ JDBC  →アプリケーション
>   0x8160      U+301C    U+301C→U+FF5E
> これが正しいとする理由です。

Java アプリケーション側のポータビリティを確保したいからです。

PostgreSQL 側から流れてくるストリーム上では、「〜」は、Shift JIS
なら常に「0x81、0x60」ですし EUC-JP ならば「0xa1、0xc1」です。

ところが、これを受ける Java 側のコンバータによって、JavaVM 内に生
成されるコードは次のように変わってしまいます。

EUC-JP ストリーム    → EUC-JP コンバータ = \u301c
Shift JIS ストリーム → SJIS   コンバータ = \u301c
Shift JIS ストリーム → MS932  コンバータ = \uff5e

一番下の例でだけ生成される文字コードが変わってしまい、もしこの文字
に依存するような処理があった場合にはポータビリティが失われてしまい
ます。現実にデフォルトエンコーディングが EUC-JP だったり SJIS だっ
たり MS932 だったりする環境は存在するわけで、それらの間で同じ Java
アプリケーションを利用したい、と考えるのであれば、デフォルトエンコー
ディングは使えないことになります。

> 私がプラットフォームのデフォルトエンコーディングにこだわる理由ですが、
> これは、
> 「作ったアプリケーションはマルチプラットフォームで動くようにしたい」
> です。

発想が逆です。マルチプラットフォームで動くようにしたいのであれば、
デフォルトエンコーディングは使わない、くらいの気持ちでないと難しい
と思います。

デフォルトエンコーディングが (ポータビリティという意味も含めて) 有
用なのは、JavaVM と、そのプラットフォーム OSとの間で I/O を行う時
のみであり、僕の経験上そういった I/O は実際はほとんどありません。

例えばデータをファイルとして外部システムとやりとりしたい時も、その
エンコード方法も含めてきちんと決めておくべきですし、ネットワーク上
の通信として I/O する場合も同様です。

さらに、そういう風に明示的にコンバータを指定する場合に、SJIS ではな
く MS932 を使わなくてはいけない局面って、ほとんどないのではないでしょ
うか?Windows プラットフォーム上で、awt 等の GUI 部品から直に Unicode
のデータを取得し、それを Shift JIS としてファイルに書かなければいけ
ない時、くらい?Windows 上で直に Unicode データが入ってくるような場
面では確かに MS932 コンバータは有用ですが、僕はそういう場合でも敢え
て (田中さんが示してくださったような風間さんの対応表などを元に) Java
レベルで文字変換をかけてから SJIS コンバータで出力する方を好みます。
将来 EUC-JP や JIS に変換しなくてはいけなくなった時、その方がきっと
楽だからです。

ご理解いただけましたでしょうか?

#Java な話ばかりですみません。

-- 
加澤恒央
Tsunehisa KAZAWA
kazawa @ sons.co.jp
SONS,. Ltd. Programmer



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