[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の文字コードになってしまうのか理解できません。
乱文失礼と思いますが、どなたか御教授いただけないでしょうか。