- PR -

hibernateでDBの日本語情報を扱う方法

投稿者投稿内容
take
大ベテラン
会議室デビュー日: 2004/08/13
投稿数: 177
お住まい・勤務地: 沖縄県北部
投稿日時: 2005-09-28 08:35
ちょま吉さんご返答ありがとうございます。
引用:

String.getBytes()はバイト配列を返します。
このバイト配列をSystem.out.printlnすると配列のハッシュコードが表示されるだけです。
このバイト配列の中身(文字コード)を見たいのであれば、
16進数で1バイトづつダンプする必要があると思います。



当方String.getBytes()で取り出した値は文字コードだと
勘違いしておりました。ご指摘ありがとうございます。

取り急ぎ16進数で1バイトずつダンプする方法を
調べてきます。
take
大ベテラン
会議室デビュー日: 2004/08/13
投稿数: 177
お住まい・勤務地: 沖縄県北部
投稿日時: 2005-10-05 14:06
どうしても分かりません。お助けください。
TEST用のクラスを作成し、実行結果を比べてみました。

***** 文字列をデータベースに登録 *****
package test;

public class TestMain {
public static void main(String[] args){
Test1Insert insert = new Test1Insert();
insert.insertTest1("あ");
}
}
***** データベースから呼び出していろいろ *****
public static void main(String[] args) {
String testStr=null;
char testChar;

TestList testList = new TestList();
java.util.List list= testList.getList();
String dataBaseKeiyu = null ;

for(Iterator ite = list.iterator(); ite.hasNext();){
Test1 test1 = (Test1)ite.next();
dataBaseKeiyu=test1.getName();
System.out.println("----- TestYobi データベース経由-----");
System.out.println(dataBaseKeiyu);
System.out.println(dataBaseKeiyu.charAt(0));
System.out.println(Integer.toHexString(dataBaseKeiyu.charAt(0)));

}

System.out.println("----- TestYobi ソース直接(String)-----");
testStr="あ";
System.out.println(testStr);
try {


//変更箇所。ここをいろいろいじって結果を見る。
String str=new String(testStr.getBytes(),"shift-jis");


char jis=str.charAt(0);
System.out.println("---- Shift-jis ----");
System.out.println(Integer.toHexString(jis));
} catch (UnsupportedEncodingException e) {

e.printStackTrace();
}

}

//変更箇所をいろいろいじって得た結果。全て「あ」という
文字を使って実験しています。

データベース経由の"あ"という文字を16進数ダンプすると、
ff82
になります。しかし、ソースコード経由で変数に格納した文字を
16進数ダンプすると
3042
になります。

データベース経由、ソースコード直接記述の文字のどちらも
EUC-JPでエンコードしなおして新しい文字をString型に格納し、
それを16進数ダンプすると両方とも
fffd
になるのです。

しかしデータベース経由、ソースコード直接記述の文字のどちらも
shift-jisでエンコードしなおして新しい文字列をString型に格納し、
それを16進数ダンプするとデータベース経由の文字は
ff82
になり、ソースコード直接の文字は
3042
になるのです。ここで結果が同じにならない理由が分かりません。

ff82という値がどの文字セットを使用して「あ」になるのかが
分かれば前に進めそうですが、調べても調べ方が正しくないのか
なかなか前に進めません。

どなたかご存知の方お願いします。

take
大ベテラン
会議室デビュー日: 2004/08/13
投稿数: 177
お住まい・勤務地: 沖縄県北部
投稿日時: 2005-10-07 23:07
引用:


ff82という値がどの文字セットを使用して「あ」になるのかが
分かれば前に進めそうですが、調べても調べ方が正しくないのか
なかなか前に進めません。

どなたかご存知の方お願いします。




自己レスですが、他の文字もダンプしてみたら、データベース経由の文字は全てff82になってしまうのです。これはおかしいと思いよく見てみると、登録した文字は1文字なのに二文字取り出す処理で二文字取り出せてしまいます。しかも1文字目はどの文字も(今回はひらがなしか試してないですが)ff82という値になります。先頭に2バイト文字1文字分の何か特別な値が入ってるような感じがするのです。今はそれが何なのかを調べてます。どなたかご存知の方がいらっしゃいましたらご教示ください。
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2005-10-07 23:40
やはりJDBCドライバやデータベースの設定間違いかバグでしょうね。
Shift_JISでの'あ'は82a0なのでバイトスワップ後に後続バイトが欠落しているとか。

可能ならば他のDBを使って試されてはいかがですか?
PostgreSQLとか、HSQLDBとか。
take
大ベテラン
会議室デビュー日: 2004/08/13
投稿数: 177
お住まい・勤務地: 沖縄県北部
投稿日時: 2005-10-07 23:49
追記です。データベース経由でダンプした
一文字目のffと2文字目のffを除くとなんと
shift-jisの文字コードと一致するのです。

文字:一文字目:二文字目:ff削除
あ:ff82:ffa0:82a0
い:ff82:ffa2:82a2
う:ff82:ffa4:82a4
こ:ff82:ffb1:82b1

「あ」をshift-jisの文字コードでは
「82a0」で表現するみたいです。同様に
他のひらがなも一致しています。

で、データベースから取り出した時にくっつく
この「ff」はなんなんでしょう。
これを調べると解決一歩手前ってことですよね?
データベースの仕様の問題とかでしょうか??
ご存知の方がいらっしゃったらお願いします。
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2005-10-07 23:56
引用:
で、データベースから取り出した時にくっつく
この「ff」はなんなんでしょう。
これを調べると解決一歩手前ってことですよね?
データベースの仕様の問題とかでしょうか??
ご存知の方がいらっしゃったらお願いします。



いや・・・仕様っていうかおかしいですよ。それ。

MySQLの最新バージョンは調査してみましたか?
思いっきりバグ報告に上がってそうな気がします。
take
大ベテラン
会議室デビュー日: 2004/08/13
投稿数: 177
お住まい・勤務地: 沖縄県北部
投稿日時: 2005-10-08 00:14
あしゅさん、ご返答ありがとうございます。
バグっていうのはぜんぜん勘定に入れてませんでした。
取り急ぎ調べてみます。

・・・って初めて調べるんですけど、MYSQLのページで
いいんですよね?とりあえずいってきます。
風晶
会議室デビュー日: 2005/10/08
投稿数: 5
お住まい・勤務地: 東京都立川市
投稿日時: 2005-10-08 09:49
一度、HIBERNATEを使わずにJDBCだけのソースコードでselectやinsert()を試みられたら如何でしょうか?もしJDBCだけのコードでもデータがおかしいようでしたら、MySQL(とMySQLのJDBCドライバ)関連のサイトに情報が出ている可能性があります。また、JDBC経由で文字化けがしなくなったのにHIBERNATE経由でもまだ文字化けするようであれば、HIBERNATE自体に何かあると思います。

それと今現在のMySQLのバージョンは4.0でよろしいですか?(最初4.1で、途中4.0に変更したとの記述があったので確認です)

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