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好吧,我对or一无所知AS400Text,但是这样的代码几乎总是一个错误:

String s = new String(bytes);

它使用平台默认编码将二进制数据转换为文本。

通常存储和检索应该经过相反的过程 - 所以当你一个字符串开始,然后将它转换为字节,并AS400Text在存储它时将它转换为一个对象,我希望你从一个AS400Text对象开始,将它转换为一个字节数组,然后在获取时将其转换为String使用。CharConverter你在这两种情况下都打电话的事实stringToByteArray表明有些不对劲。

dbRemarks(如果你能告诉我们它是什么,以及你是如何获取它的,这也会有所帮助。)

我确实注意到,在检查了一些文档AS400Text后,我看到了这个:

由于最近字符转换例程的行为发生了变化,因此不再需要此系统对象,除非将 AS400Text 对象作为参数传递到 Toolbox 代理连接上。

有类似的文档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 中的数据,将其转换为日文并提供在网页中进行编辑。我从结果集中得到 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,我需要转换为字符串以在网页中进行编辑或存储在表中。所以,我尝试过这种方式,但无法成功:

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 回答