网络与主机环境如下,中央服务器A,OS为AIX,各省服务器B,C,D等等,有三十几台,OS也有AIX,Sorials等等,省服务器上的OS默认编码并不一致,也无权修改,各省服务器上的应用服务器在启动时有的添加了指定UTF-8编码,有的没有指定。此配置也不可改变。所有资源,包括Java,jsp,html等等都是以UTF-8编码保存。
现在的需求是我需要编程实现将各省服务器,如B,C,D上的一个字符串(当然,该字符串中是有中文的,否则也就没有这个问题的存在了)发送给中央服务器A。然后保存到中央服务器的数据库中,并且要求不以明文传递,也不能通过查看表查看到该字符串的内容。
我的想法是这样,在B,C,D服务器上将字符串都通过如下代码进行转码,保证不管哪台服务器上传输前都是以UTF-8编码
String originalStr = "abc需要传送的串123";
originalStr = new String(originalStr.getBytes(),"UTF-8");
然后在B,C,D服务器上将testStr用一个加密方法进行加密,加密的密文全部是ASCII码,这样就避免了在网络间传输的编码问题,并且达到了非明文传递的要求。
服务器A获得这个加密的串后先解密,然后用如下代码还原:
String originalStr = new String(originalStr.getBytes("UTF-8"));
当然,问题出现了,并且是C传过来的数据处理是正常的,B或者D传过来的数据处理就不行了
感觉问题出在getBytes()不传参数的这种形式上,即以下代码:
originalStr = new String(originalStr.getBytes(),"UTF-8");
在某些服务器上无法正常保证能够得到一定是以UTF-8编码的字符串,证据如下:
相同内容的字符串如下所示:
String originalStr = "abc需要传送的串123";
都经过如下处理
originalStr = new String(originalStr.getBytes(),"UTF-8");
在不同的服务器上利用加密方法进行加密后得到的密文完全不一样,并且该密文在同一台主机上使用解密方法都能正确还原;但是传到中央服务器A上后,利用解密方法有些就可以还原,有些不可能还原。因为加密方法得到的密文就已经不一样,并且传输过程中都是以ASCII码传递的,所以有些在中央服务器上无法还原我本人认为并不是因为网络间传递引起的编码问题。问题本质应该还是在以下代码行中:
originalStr = new String(originalStr.getBytes(),"UTF-8");
该代码行真能保证得到的串都是以UTF-8编码的吗,getBytes()在复杂情况之下,是否真能保证获得当前的正确编码?
因为显然的是,加密方法都是在字节数组上处理数据,如果该行代码对相同内容的字符串无法保证都能转到UTF-8的话,那么在字节数组上的数据肯定就一样了,这样也就解释了为什么在不同服务器上相同内容的串的密文不一样的问题。
那么getBytes()不传参数的这种默认形式与OS的默认编码,应用服务器启动时指定的编码,资源文件的编码都有关系吗?要解决此问题最好的办法是什么?
欢迎大家讨论,非常感谢!

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【huijunzi】截止到2008-07-30 10:11:34的历史汇总数据(不包括此帖):
    发帖的总数量:0                        发帖的总分数:0                        每贴平均分数:0                        
    回帖的总数量:0                        得分贴总数量:0                        回帖的得分率:0%                       
    结贴的总数量:0                        结贴的总分数:0                        
    无满意结贴数:0                        无满意结贴分:0                        
    未结的帖子数:0                        未结的总分数:0                        
    结贴的百分比:---------------------结分的百分比:---------------------
    无满意结贴率:---------------------无满意结分率:---------------------
    如何结贴请参考这里:http://topic.csdn.net/u/20080501/09/ef7ba1b3-6466-49f6-9d92-36fe6d471dd1.html

    取消马甲机器人,请点这里:http://www.java2000.net/mycsdn/robotStop.jsp?usern=huijunzi
      

  2.   

    我个人认为在B、C、D机器上进行:originalStr = new String(originalStr.getBytes(),"UTF-8"); 
    这时getBytes()是取得各OS机的默认编码,通过URL进行传递时一般的编码是:iso-8859-1,不妨试试originalStr = new String(originalStr.getBytes("iso-8859-1"),"UTF-8"); 
      

  3.   

    因为orininalStr并非通过URL进行传递过来的变量,所以应该不存在所说的需要从iso-8859-1的问题