1

文字セット変換の問題があります:

次の変換方​​法を使用して、iSeries システムの DB2 で日本語の漢字を更新しています。

AS400 sys = new AS400("<host>","username","password");
CharConverter charConv = new CharConverter(5035, sys);
byte[] b = charConv.stringToByteArray(5035, sys, "試験");
AS400Text textConverter = new AS400Text(b.length, 65535,sys);

取得中に、次のコードを使用して変換して表示します。

CharConverter charConv = new CharConverter(5035, sys);
byte[] bytes = charConv.stringToByteArray(5035, sys, dbRemarks);
String s = new String(bytes);
System.out.println("Remarks after conversion to AS400Text :"+s);

しかし、システムは表示中に文字化けを表示しています。バイナリストレージから日本語の文字をデコードするのを手伝ってくれる人はいますか?

4

3 に答える 3

3

CharConverterまたはについては何も知りませんがAS400Text、次のようなコードはほとんどの場合間違いです。

String s = new String(bytes);

これは、プラットフォームのデフォルトのエンコーディングを使用して、バイナリ データをテキストに変換します。

通常、保存と取得は反対のプロセスを経る必要があります。そのため、文字列から始めてバイトに変換し、それをAS400Text保存するときにそれをAS400Textオブジェクトに変換している間に、オブジェクトから始めて、それをバイト配列を取得し、フェッチ時にそれをStringusingに変換します。CharConverterどちらの場合も呼び出しているという事実は、stringToByteArray何か問題があることを示唆しています。

dbRemarks(何が何で、どのように取得したかを教えていただけると助かります。)

のいくつかのドキュメントAS400Textを確認したところ、次のことがわかりました。

文字変換ルーチンの動作が最近変更されたため、ツールボックス プロキシ接続で AS400Text オブジェクトがパラメーターとして渡される場合を除いて、このシステム オブジェクトは不要になりました。

についても同様のドキュメントがありCharConverterます。本当にこれを経験する必要がありますか?中間の手順を経ずに、文字列を直接保存して直接取得しようとしましたか?

于 2013-10-30T17:16:03.430 に答える
1

ジョンとバック・カラブロに感謝!

あなたの手がかりで、私は次のアプローチで成功しました:

String remarks = new String(resultSet.getBytes("remarks"),"SJIS");
byte[] byteData = remarks.getBytes("SJIS");
CharConverter charConv = new CharConverter(5035, sys);
String convertedStr = charConv.byteArrayToString(5035, sys, byteData);

文字列から変換できました。私はJPAで同じことを実装する予定で、コーディングを開始しました。

于 2013-11-04T16:41:59.997 に答える
1

ありがとうジョン・スキート!

はい。宣言中に文字列をエンコードしないという間違いを犯しました。

私の問題は、DB2 に保存されているデータを取得し、それを日本語に変換して、Web ページで編集できるようにすることです。結果セットから dbRemarks を取得しています。私は自分の投稿で別のことを見逃していました:

挿入中に、次のようなテキストに変換しています。

String text = (String) textConverter.toObject(b);
PreparedStatement prepareStatementUpdate = connection.prepareStatement(updateSql);
prepareStatementUpdate.setString(1, text);
int count = prepareStatementUpdate.executeUpdate();

次のコードを使用して、取得して明確に表示できます。

String selectSQL = "SELECT remarks FROM empTable WHERE emp_id = ? AND dep_id=? AND join_date='2013-11-15' ";
prepareStatement = connection.prepareStatement(selectSQL);
prepareStatement.setInt(1, 1);
prepareStatement.setString(2, 1);
ResultSet resultSet = prepareStatement.executeQuery();
while ( resultSet.next() ) {
    byte[] bytedata = resultSet.getBytes( "remarks" );
    AS400Text textConverter2 = new AS400Text(bytedata.length, 5035,sys);
    String javaText = (String) textConverter2.toObject(bytedata);
    System.out.println("Remarks after conversion to AS400Text :"+javaText);
}

JDBC では正常に動作していますが、JPA で動作するには、Web ページで編集するか、テーブルに保存するために文字列に変換する必要があります。だから、私はこの方法を試しましたが、成功できませんでした:

String remarks = resultSet.getString( "remarks" );
byte[] bytedata = remarks.getBytes();
AS400Text textConverter2 = new AS400Text(bytedata.length, 5035,sys);
String javaText = (String) textConverter2.toObject(bytedata);
System.out.println("Remarks after conversion to AS400Text :"+javaText);
于 2013-10-31T05:41:28.253 に答える