目前我们的应用程序托管在WAS6.1上,符合Java 1.5。此应用程序能够从/向数据库(Sql Server 2008)读/写双字节(日语)字符。我使用Java 1.7重新编译了相同的代码并部署在WAS8.5.5服务器上。但是从WAS8.5.5托管的应用程序中,每当我读取双字节字符并存储在db上时,这些字符都存储为???。我猜WAS8.5.5应用程序无法将这些字符处理为UTF-8。是否有任何设置要更改JVM以将所有.class文件读为UTF-8?两个服务器都具有相同的代码。任何帮助表示赞赏。
答案 0 :(得分:0)
Java字符串在内部是UTF-16编码的,因此当您从DB读取字符串时,JDBC驱动程序负责将任何DB内部格式反序列化为java String。
无法设置编译器以防止这种情况发生。此外,虽然.java源可以以不同的方式编码,但类文件中的字节码也是如此。
我会调查JDBC驱动程序(不太可能)或HTTP传输。
如果你想进行测试尝试从DB中读取一个值并在DB上再次写入它而不通过请求/响应序列化/反序列化,如果它仍然存在,那么你就找到了罪魁祸首。
大多数情况下,问题来自解释传入流或使用错误的默认值编写传出流。
查看IBM KB了解详情。
我验证了您的示例,令我惊讶的是,更改源编码确实会更改生成的输出。
所以我尝试从cmd行调用它,将控制台设置为utf-8(chcp 65001
),经过几次检查后我发现了什么不对,当你改变java源码的编码时,Eclipse改变了运行应用程序时的默认编码。
我通过编译类的md5sum来仔细检查类文件。
当然,您在控制台上获得的是运行测试应用程序时使用的file.encoding属性的结果。
我仍然相信你应该检查请求输入和结果输出的编码,因为它们强烈依赖于容器和更改版本的websphere可能导致某些配置中的默认值不同,也只是更改容器的实例也将重置配置完成(必须重新申请)。
答案 1 :(得分:0)
我解决了这个问题。但是更新这个帖子,想到这可能对某人有所帮助。 问题出在JDBC驱动程序上。在WAS 6.1.1中工作的SQL Server驱动程序的方式在WAS 8.5.5中不能以相同的方式工作。当我在WAS 8.5.5中创建一个新的数据源时,我得到一些默认的自定义属性。其中一个自定义属性“sendStringParametersAsUnicode”值设置为false。其中预期值为真。一旦我改为true,我就能正确地将双字节字符写入数据库。