Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从WAS8.5.5上托管的java应用程序读取/写入双字节字符_Java_Encoding_Utf 8_Websphere - Fatal编程技术网

从WAS8.5.5上托管的java应用程序读取/写入双字节字符

从WAS8.5.5上托管的java应用程序读取/写入双字节字符,java,encoding,utf-8,websphere,Java,Encoding,Utf 8,Websphere,目前,我们的应用程序托管在WAS6.1上,符合Java1.5。此应用程序能够从数据库(Sql Server 2008)读取/写入双字节(日语)字符。我使用Java1.7重新编译了相同的代码,并部署在WAS8.5.5服务器上。但在WAS8.5.5托管的应用程序中,每当我读取双字节字符并存储在db上时,这些字符都存储为???。我猜WAS8.5.5应用程序无法将这些字符作为UTF-8处理。JVM上是否有任何设置要更改为将所有.class文件读取为UTF-8?两台服务器的代码相同。非常感谢您的帮助。Ja

目前,我们的应用程序托管在WAS6.1上,符合Java1.5。此应用程序能够从数据库(Sql Server 2008)读取/写入双字节(日语)字符。我使用Java1.7重新编译了相同的代码,并部署在WAS8.5.5服务器上。但在WAS8.5.5托管的应用程序中,每当我读取双字节字符并存储在db上时,这些字符都存储为???。我猜WAS8.5.5应用程序无法将这些字符作为UTF-8处理。JVM上是否有任何设置要更改为将所有.class文件读取为UTF-8?两台服务器的代码相同。非常感谢您的帮助。

Java字符串是内部UTF-16编码的,因此当您从DB读取字符串时,JDBC驱动程序负责将任何DB内部格式反序列化为Java字符串

无法设置编译器来防止这种情况。此外,虽然.java源代码可以用不同的方式编码,但类文件中的字节码却不是这样

相反,我将研究JDBC驱动程序(可能性较小)或HTTP传输

如果要进行测试,请尝试从DB读取一个值,然后在DB上再次写入该值,而不通过请求/响应序列化/反序列化,如果该值保持为真,则找到了罪魁祸首

大多数情况下,问题来自解释传入流或使用错误的默认值写入传出流

查看更多信息

编辑 我验证了您的示例,令我非常惊讶的是,更改源代码确实更改了结果输出

因此,我尝试从cmd行调用它,将控制台设置为utf-8(
chcp 65001
),经过几次检查后,我发现了问题所在,当您更改java源代码的编码时,Eclipse会在运行应用程序时更改默认编码

我通过对编译后的类进行md5sum来仔细检查类文件

因此,在控制台上得到的肯定是运行测试应用程序时使用的file.encoding属性的结果


我仍然认为您应该检查请求输入和结果输出的编码,因为它们强烈依赖于容器,更改websphere版本可能会导致某些配置中出现不同的默认值,而且更改容器实例也会重置配置(必须重新应用).我解决了这个问题。。但是更新这个线程,认为这可能会帮助一些人。
问题在于JDBC驱动程序。SQL Server驱动程序在6.1.1中的工作方式与在8.5.5中的工作方式不同。当我在WAS8.5.5中创建一个新的数据源时,我得到了一些默认的自定义属性。其中一个自定义属性“SendStringParametersUnicode”值设置为false。其中,预期值为真。一旦我改为true,我就能够正确地将双字节字符写入数据库。

我编写了一个简单的类,从数据库读取双字节字符,并在控制台上打印。我保存了这个类,因为我的操作系统是Windows,默认情况下该类以cp1252编码格式保存。当我运行这个类时,双字节字符被打印为???。当我用UTF-8编码保存同一个类并运行时,双字节字符打印正确。我不认为问题在于驱动程序和请求/响应序列化/反序列化。当你说class时,你是指.java源文件吗?是的。。我的意思是.java源文件。这里缺少一些东西,我看不到源文件编码和从数据库返回的字符串编码之间的联系。你是怎么得到这个字段的?我认为你应该发布你的简单课程。顺便问一下,如何设置源文件编码?我添加了示例类及其输出。我不确定.java文件编码格式是否是问题所在,但从测试中我感觉到了这一点。