这次在编写java版ems的时候,遇到中文接收乱码问题(环境,Python客户端,Java服务端)。刚好对编码问题没什么概念,硬着头皮乱搞一气,无果。当晚请到无线徐工前来帮忙,也是折腾了很久,大概知道是Ice.jar内部编码造成数据无法还原。测试如下:
public static void testZh() throws Exception{
String str = "中文"; //原字符
byte[] bys = str.getBytes("gbk");
String nstr = new String(bys, "utf8"); //被编译字符
System.out.println(nstr); //????
byte[] nbys = nstr.getBytes("utf8");
String rstr = new String(nbys, "gbk");
System.out.println(rstr); //锟斤拷锟斤拷
}
主要问题是在Ice.jar包中默认以UTF8编码,官方讨论区也有国人遇到此问题http://www.zeroc.com/forums/help-center/2878-ice-client-encoding-gbk-error.html,官中人强荐在传输中转码为utf8,我们这么多年的代码积累,岂能说迁就能迁,听国人意见,重新编译Ice.jar包。
grep -rl UTF ./|xargs replace 'UTF-8' 'ISO-8859-1' --
grep -rl UTF ./|xargs replace 'UTF8' 'ISO-8859-1' --
在编译中出现一些不自带的第三方包,但因版本众多,最后还是实验出了合适的版本(下载后把jar包加入到CLASSPATH中即可):
wget http://www.java2s.com/Code/JarDownload/jgoodies/jgoodies-forms-1.4.0.jar.zip
wget http://www.java2s.com/Code/JarDownload/jgoodies/jgoodies-looks-2.2.1.jar.zip
最后执行 ant -f build.xml就编译成功了。
鸣谢:徐阳