- PR -

データベースから取得したShift-JISをEUCに変換したい

投稿者投稿内容
tnakamura
会議室デビュー日: 2004/03/25
投稿数: 5
投稿日時: 2004-03-26 20:01
永井さん、しょむさん有難うございます。

説明がまた足りてませんでした。すみません。

DBの中にいくつかテーブルがあるのですが
テーブルAではEUC-JPの日本語文字でデータをもっていて、
テーブルBではShift_JISの日本語文字でデータをもっています。

それでJSP1→Bean1ではテーブルAからデータ(EUC-JP)を取得し、表示
させるのですが、その場合

ResultSet.getString(columnIndex)

で文字化けせずにデータが表示できました。

JSP2→Bean2ではテーブルBからデータ(Shift_JIS)を取得し、表示
させるのですが、その場合文字化けが起きてしまっています。

またJSPの表示ですが親JSPからいくつかフレーム分けをしていまして
そのうちの1つの子JSPがここで言うJSP2になっています。



パターン2について
DBに接続している箇所には"charset=EUC_JP"というような記述がありませんでした。

パターン3について
残念ながら文字化け("??????????????"の表示)になってしまいました。

パターン1はこれからやってみます。


あとはDBの環境がどうなっているかですね。
私のほうで確認ができるかどうか・・・・

もしくはバイナリデータで取り出して処理するですか。


ClusterさんからgetByteで確認してみたら と言うことでしたので

resultset.getByte(columnIndex)で取り込んでみたのですが

java.lang.Exception

と出てしまいました。ただこちらはbyteで取れたあとどうやって文字に変換
するのか分かりませんでした・・・・

またgetBytesでやってみたのですが

byte[] btKanji = new byte[28];
btKanji = lrs.getBytes(i+1);
String sGet = new String(btKanji, "EUC-JP");

こちらも2行目のbtKanjiにセットするところで

java.lang.Exception

と出てしまいました。

取得の仕方がよくないのでしょうか・・・・
シュン
ぬし
会議室デビュー日: 2004/01/06
投稿数: 328
お住まい・勤務地: 東京都
投稿日時: 2004-03-28 22:13
引用:

tnakamuraさんの書き込み (2004-03-26 20:01) より:

テーブルAではEUC-JPの日本語文字でデータをもっていて、
テーブルBではShift_JISの日本語文字でデータをもっています。




それは、そこを直した方がよいかと…
永井和彦
ぬし
会議室デビュー日: 2002/07/03
投稿数: 276
お住まい・勤務地: 東京都
投稿日時: 2004-03-29 11:19
引用:

シュンさんの書き込み (2004-03-28 22:13) より:
引用:

tnakamuraさんの書き込み (2004-03-26 20:01) より:

テーブルAではEUC-JPの日本語文字でデータをもっていて、
テーブルBではShift_JISの日本語文字でデータをもっています。




それは、そこを直した方がよいかと…



同一DB内で複数日本語文字コードの混在ですか……。
今までの私の提案は忘れてください(TT

シュンさんの仰る通りで、混在しているという状況自体を直した方がいいです。
#と言うか、違う文字コードで突っ込んだ人、論外です(TT
tnakamura
会議室デビュー日: 2004/03/25
投稿数: 5
投稿日時: 2004-03-29 17:05
シュンさん、永井さん有難うございます。

同一DB内に複数の日本語文字コードが存在してはいけないのですね。

Tera Term ProでSQLを実行したときに文字化けしなかった為
データは壊れていないと判断し、データが壊れていないのなら
『表示できるのでは』と思っていました。

たとえデータが壊れていなくてもDBの日本語文字コードの設定と
実際テーブルに入っている日本語文字コードが違っていると
DBからデータを取得した時点で化けてしまう(DBで設定している
日本語文字コードで落とすため)と言うことですね。
(あっているかなぁ・・・・・・・)

ただDBの構築・設定、DBへデータをインサートするプログラムを
私のほうで作ったのではなく、他所が作ったため修正が可能かどうか
分からない状況です。

現状のままで表示させる方法はまったくないのでしょうか?
何か逃げ道がありましたら試してみたいと思っております。

それとも、このようなテーブルの持ち方では100%無理なのでしょうか?

無茶なことを聞いているかもしれませんが宜しくお願いします。
シュン
ぬし
会議室デビュー日: 2004/01/06
投稿数: 328
お住まい・勤務地: 東京都
投稿日時: 2004-03-29 18:51
引用:

tnakamuraさんの書き込み (2004-03-29 17:05) より:
シュンさん、永井さん有難うございます。

たとえデータが壊れていなくてもDBの日本語文字コードの設定と
実際テーブルに入っている日本語文字コードが違っていると
DBからデータを取得した時点で化けてしまう(DBで設定している
日本語文字コードで落とすため)と言うことですね。
(あっているかなぁ・・・・・・・)



そうですね。JDBCドライバは、1つJVMに対して1種類の文字コードコンバータしか適用してくれないようです。テーブルごとにコンバータを変更してくれるようなインターフェイスは持っていないような…もしかしたら、お使いになっているJDBCドライバの固有の実装として、そういったものがあるかもしれません。しかしそのようなDBの使い方自体が、ドライバ開発者にとって想定外だと思いますので、余り期待できないかと思います。

tnakamuraさんの環境では、その唯一のコンバータがEUC_JP(DB)<->UCS-2(JVM)に設定されているということだと思います。

引用:

ただDBの構築・設定、DBへデータをインサートするプログラムを
私のほうで作ったのではなく、他所が作ったため修正が可能かどうか
分からない状況です。

現状のままで表示させる方法はまったくないのでしょうか?
何か逃げ道がありましたら試してみたいと思っております。

それとも、このようなテーブルの持ち方では100%無理なのでしょうか?

無茶なことを聞いているかもしれませんが宜しくお願いします。




JDBCドライバの唯一のコンバータを"変換しないコンバータ"に設定して、JVM内部でResultSet#getString()で得られた文字列に対して、new String(src.getBytes("ISO-8859-1"),"テーブルごとの文字コード")で変換を行えば、いけるかもしれません。手元に環境がないので確証が有りませんが、お試しになってみてはいかがでしょうか。
SJ0392
ベテラン
会議室デビュー日: 2004/02/05
投稿数: 62
お住まい・勤務地: 神奈川・横浜
投稿日時: 2004-03-29 23:36
> ただDBの構築・設定、DBへデータをインサートするプログラムを
> 私のほうで作ったのではなく、他所が作ったため修正が可能かどうか
> 分からない状況です。
EUCとSJISで分けている理由が判りません。
そもそも DBの言語設定 に極力合わせるべきじゃないでしょうか?(自分はそうしてます)
分けている明確な理由がないのなら不適切な文字コードで格納している方の怠慢だと思います。
DBの言語設定が判らないので、何がお勧めともいえません。
やはり修正をお願いされた方が良いのではないでしょうか?
(もしくは DB設計を見直すとか・・・)
永井和彦
ぬし
会議室デビュー日: 2002/07/03
投稿数: 276
お住まい・勤務地: 東京都
投稿日時: 2004-03-30 11:36
永井です。
「データを突っ込む段階の処理を再考すべき」というのが基本スタンスで変わらないわけですが、「どうしても」という場合もありますので、一応考えてみました。

コード:
String str = null;
BufferedReader br = new BufferedReader(new InputStreamReader(result.getBinaryStream(1), "Shift_JIS"));
while((str = br.readLine()) != null){
    System.out.println(str);
}



対象が特殊な環境のために、こちらで実験が困難な状況なのですが……もしかしたら、上記のようなコードで内容取得出来るかも知れません。
一応、意図しているところとしては、「バイナリとしてDB内容を取得。エンコード明示で文字列として解釈」です。

こちらの環境では出たんですが……普通に#getString()で出てしまう環境なので、何とも……。
tnakamura
会議室デビュー日: 2004/03/25
投稿数: 5
投稿日時: 2004-03-30 22:29
シュンさん、SJ0392さん、永井さん有難うございます。

いろいろご提案して下さったやり方で試してみたいと思います。

あとDBへデータを取り入れる段階での処理のほうでも検討しよう
という話も出ています。
まだはっきりと決まったわけではないので分かりませんが
とりあえず検討した結果どうなるかという形になりました。

結果の方が出ましたらまたこちらに掲示致します。

多大なご助力感謝しています。

スキルアップ/キャリアアップ(JOB@IT)