无法将字节从字符集 65535 转换为日语 (5035)

问题描述 投票:0回答:3

我遇到字符集转换问题:

我正在使用以下转换方法更新 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);

但是,系统显示时显示乱码。 有人可以帮我从二进制存储中解码日语字符吗?

java utf-8 db2 ibm-midrange db2-400
3个回答
3
投票

好吧,我对

CharConverter
AS400Text
一无所知,但这样的代码几乎总是一个错误:

String s = new String(bytes);

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

通常存储和检索应该经历相反的过程 - 因此,当您使用字符串开始,然后将其转换为字节,并在存储它时将其转换为

AS400Text
对象时,我希望您从一个
AS400Text
对象,将其转换为字节数组,然后在获取时使用
String
将其转换为
CharConverter
。事实上,您在这两种情况下都拨打
stringToByteArray
表明存在问题。

(如果您告诉我们

dbRemarks
是什么以及如何获取它也会有帮助。)

我确实注意到,在检查了一些

AS400Text
的文档后,我看到了这个:

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

CharConverter
有类似的文档。您确定您真的需要经历这个吗?您是否尝试过直接存储字符串并直接检索它,而不经过中间步骤?


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);
    

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 实现同样的功能,并开始编码。

© www.soinside.com 2019 - 2024. All rights reserved.