[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends:00012] データベースからの得たデータの文字コード変換



林@札幌です。
お世話になります。

[動作環境]
os:RedHatLinux7.3
kernel:2.4.18-3
javaSDK:1.4.0_01
appserver:tomcat-3.2.4
DB:MySQL-3.23.49
JDBCドライバ:gweMySQLJDBC
コンソール画面の文字コード:SJIS

データベースからデータを得てXMLファイルを生成するのですが、文字化けを回避することが
うまくいきません。現在は原因を特定するためにまずはコンソール画面での文字化け回避を
しています。

本来はデータベースからデータを得てXMLファイルを生成し、FLASHにそのXMLデータを渡して
FLASHでデータベースの内容を表示させます。
最初WindowsXPで開発し、動作させたときは文字コードを意識しなくてもうまくいったのですが、
Linuxで再開発するとやはり文字化けを起こしました。
そのため、文字コード変換をしています。

原因を調べるためにバイナリデータで考えてみました。
以下は、"効果音A"の各文字コードのバイナリデータです。
******************************************
none    :B8FAB2CCB2BB41    ←データベースから得たデータ
SJIS    :8CF889CA89B941    ←データをSJISに変換したい
MS932   :8CF889CA89B941
Unicode :FFFEB9529C67F3974100
EUC_JP  :B8FAB2CCB2BB41
EUCJIS  :B8FAB2CCB2BB41
JIS     :1B2442387A324C323B1B284241
8859_1  :3F3F3F41
******************************************
trace   :3F3F3F41       ←EUC文字列をSJISに変換したデータ
encode_test===???A      ←本来ここに"効果音A"と表示されてほしい

コンソールで確認するためのソースコード
      String sound_e = rs.getString(i++);
      System.out.println("******************************************");
      System.out.println("none    :" + Tracer.toHex(sound_e.getBytes()));
      System.out.println("SJIS    :" + Tracer.toHex(sound_e.getBytes("SJIS")));
      System.out.println("MS932   :" + Tracer.toHex(sound_e.getBytes("MS932")));
      System.out.println("Unicode :" + Tracer.toHex(sound_e.getBytes("Unicode")));
      System.out.println("EUC_JP  :" + Tracer.toHex(sound_e.getBytes("EUC_JP")));
      System.out.println("EUCJIS  :" + Tracer.toHex(sound_e.getBytes("EUCJIS")));
      System.out.println("JIS     :" + Tracer.toHex(sound_e.getBytes("JIS")));
      System.out.println("8859_1  :" + Tracer.toHex(sound_e.getBytes("8859_1")));
      System.out.println("******************************************");
      String sound = new String(sound_e.getBytes("SJIS"), "EUC_JP");
      System.out.println("trace   :" + Tracer.toHex(sound.getBytes()));
      System.out.println("encode_test===" + sound);
      System.out.println("");

コンソール画面でのデバックでは"効果音A"という文字列データを得たときに、
EUC_JPで得ているのがわかります。(バイナリデータを確認の上)

コンソール画面はSJIS指定しているのでEUC_JPをSJISに変換すればうまく表示できると思います。

このEUC文字列をSJISに変換するソースコードは
String sound = new String(sound_e.getBytes("SJIS"), "EUC_JP");
で文字コード変換するのですがこれを
System.out.println("encode_test===" + sound);
でコンソールに吐き出すと
trace   :3F3F3F41(8859_1の文字コード)
になってしまい文字化けしてしまいます。

なぜ、8859_1の文字コードになってしまうのか理解できません。
乱文失礼と思いますが、どなたか御教授いただけないでしょうか。