- - PR -
hibernateでDBの日本語情報を扱う方法
1|2|3
次のページへ»
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2005-09-20 04:14
いつもお世話になります。開発環境:windowsXP(HOME) j2sdk1.4.2_06、
TOMCAT4.1.31、ECLIPSE3.0.1、MYSQL4.1、struts1.1、HIBERNATE2.1.7、 velocity1.4 です。 HIBERNATEを使用、エラー処理はSTRUTS、表示をvelocityにさせるWEBアプリを 作成しようとしたら、日本語を表示させようと頑張っても文字化けしてしまいます。 解決策が見つからず質問させていただいたところです。 今回は問題の切り分けのために、HIBERNATE、STRUTS、velocityそれぞれで データベースに直接アクセスさせてみたところ、文字化けするのはHIBERNATEで データベースにアクセスしたときのようなのでHIBERNATEで日本語を扱う方法を ご存知の方がいらっしゃいましたらご教示願います。 *** DBから情報をリストで取得するクラスのソース *** import java.util.List; public class TestList { public TestList() { } public List getList(){ List list=null; try{ Configuration cfg = new Configuration(); cfg.configure(); SessionFactory sf = cfg.buildSessionFactory(); Session sess = sf.openSession(); Criteria cri = sess.createCriteria(Test1.class); list = cri.list(); sess.close(); } catch(HibernateException e){ //e.printStackTrace(); System.out.println(e.getMessage()); } return list; } } *** テスト表示用mainクラス *** import java.util.Iterator; import entity.hibernate.Test1; public class TestYobi { public static void main(String[] args) { TestList testList = new TestList(); java.util.List list= testList.getList(); for(Iterator ite = list.iterator(); ite.hasNext();){ Test1 test1 = (Test1)ite.next(); System.out.println(test1.getName() + ":"+ test1.getEmail()); } } } データベースに登録した情報はコマンドプロンプトからMYSQLを起動、 コマンドプロンプトで漢字入力ができる状態でINSERT処理をしたので エンコードはSJISになってると思います(OS=winXP)。WEBアプリを 作成中にエンコードの指定等は全てSJISで行っておりました。今回の mainテスト用のクラスでもコンソールに文字化けが出てしまって まいっております。 どうかよろしくお願いします。 | ||||
|
投稿日時: 2005-09-21 17:44
自己レスです。
WEBにもなかなか情報がないのでHIBERNATEはあきらめたほうがいいのかなーみたいなテンションになってきております。結構使ってるひといるような感じだったので使ってみたのですが・・・。その辺だけでも情報いただけるとありがたいです。 | ||||
|
投稿日時: 2005-09-21 19:06
Hibernateが原因となって文字化けした記憶はないです。
JDBCドライバ側が問題になってるのではないでしょうか。 MySQLの日本語処理が怪しそうな気がします。 #どこかでそんな記事を見かけたような?? | ||||
|
投稿日時: 2005-09-21 22:18
あしゅさんご返答ありがとうございます。確かにWEBでもhibernateの
エンコード処理等のサイトは皆無に近いです。というかいままで 見たことがありません。やはりあしゅさんのおっしゃるとおりhibernate が原因と考えるよりも他に原因があると考えたほうがよろしいのでしょうか。 MYSQL4.1系は文字化けのバグがあるとのことなので4.0にしてみたのですが やっぱりだめでした。データ登録の方法に問題があるのか・・・。 JSPやSTRUTUS経由のJSPでちゃんと表示できてるのでMYSQLには問題が無いと 決め付けてしまいました。 もう一度確かめてみます。 | ||||
|
投稿日時: 2005-09-27 15:26
すみません、大分時間が経ってしまいました。
いろいろ調べているうちに壁にぶち当たってしまいました。 どなたかお助けください。 String.getBytesメソッドを使用してデータベースに登録 して呼び出した文字列とそうでない文字列を比較して、 返された値からどの文字セットを使用しているかを調べよう と思ったのですが、どのように調べたらいいのかが見つかりません。 **「a」という文字をデータベース経由とソースコードから ** ** そのままgetBytesで取り出したものの比較 ** データベース経由→ [B@1774b9b ソースコードそのまま→ [B@104c575 文字セットの種類が分かれば大分前進できそうな感じがします。 ちなみに使用したクラスのソースは下記のとおりです。 HIBERNATEを経由してデータベースにアクセスしています。 package test; import java.util.Iterator; import entity.hibernate.Test1; /** * @author takeshi * * この生成されたコメントの挿入されるテンプレートを変更するため * ウィンドウ > 設定 > Java > コード生成 > コードとコメント */ public class TestYobi { public static void main(String[] args) { String testStr=null; TestList testList = new TestList(); java.util.List list= testList.getList(); for(Iterator ite = list.iterator(); ite.hasNext();){ Test1 test1 = (Test1)ite.next(); System.out.println(test1.getName()); System.out.println(test1.getName().getBytes()); } testStr="a"; System.out.println(testStr.getBytes()); } } どなたかよろしくお願いします。 | ||||
|
投稿日時: 2005-09-27 16:08
こんにちは。
MySQLの設定ファイル、mysql.iniにdefault-character-setなるパラメータが ありますが、この辺関係ありますでしょうか? 参考URL http://wind-master.dip.jp/soft-info/mysql/mysql02.html 以上お役に立てれば幸いです。 | ||||
|
投稿日時: 2005-09-27 16:48
takashi、すばやいレスありがとうございます。
my.iniの内容は以下のようにしています。 [WinMySQLAdmin] Server=C:/mysql/bin/mysqld-nt.exe [mysqld] default-character-set=sjis [client] default-character-set=sjis OSはwindowsなのでsjisでいいのかなと。 もしこの設定が正しければ、データベース経由の 文字列はsjisでエンコードされて出力されている はずですよね? sjisでエンコードされてる文字をgetBytesしたら [B@1774b9b になると理解してます。あってます? としたらソースコードのリテラルをgetBytesした 値のエンコードはなんなんでしょう?? [B@104c575 ←こいつです レテラルを直接getBytesした値を確認する前に、 とりあえずmy.iniの設定が正しいかどうかを確認したいのですが コマンドを見つけることができません。 わかれば確認できるのですが・・・。 mysql> show character set; では見れないんですよね? | ||||
|
投稿日時: 2005-09-28 01:17
String.getBytes()はバイト配列を返します。
このバイト配列をSystem.out.printlnすると配列のハッシュコードが表示されるだけです。 このバイト配列の中身(文字コード)を見たいのであれば、 16進数で1バイトづつダンプする必要があると思います。 |
1|2|3
次のページへ»