环境:
oracle 9i,数据库字符集设置为AMERICAN_AMERICA.UTF8,客户端NLS_LANG设置为AMERICAN_AMERICA.UTF8
java swing开发的GUI程序通过thin方式链接数据库
另外一个exe程序,通过jdbc链接数据库
操作系统:windows 2000,区域设置为chinese(Hong Kong)
JDK 1.3,因为种种原因,只能用这个版本的jdk
均部署在同一台机器上问题描述:
String encoding = System.getProperty("file.encoding");
System.out.println(encoding);
得到的file.encoding为MS950exe程序录入的简繁体中文,如“你”,内码为MS950,每个在数据库中保存为双字节,“a7,41”,在exe中正常显示;而在java程序中显示为乱码,跟踪java程序,发现从jdbc拿过来的字符串变成了方框
java程序录入的同样的简繁体中文,在数据库中保存为三字节“e4,bd,a0”,从数据库得到的字符串然后getBytes(),又变成“a7,41”,在java显示正常,而exe中无法正常显示exe已经无法修改,因为没有源码请问:如何配置,使exe以及java程序均能够正确显示exe录入的双字节简繁体中文?

解决方案 »

  1.   

    GBK 和 utf8 之间的转换,在存入数据库之前,通过 java 把文字转成 GBK码
      

  2.   

    传输之前,对字符做一次编码,拿到utf8编码, 传输utf8的代码, utf8的代码本身都是asc码能识别的,所以不会出现乱码问题, 任何编码方式都可以解码得到正确的字符, 客户端使用二次解码的方式得到最终结果.例如:
    假设"中国"的utf8编码为\u1111\u2222\u3333\u4444
    服务端将"中国"首先转换成\u1111\u2222\u3333\u4444, 传输的时候传输\u1111\u2222\u3333\u4444, 这样,在传输过程是不会出现乱码的.
    客户端接受到的是\u1111\u2222\u3333\u4444, 将\u1111\u2222\u3333\u4444转换成"中国".写到这里感觉好像不是楼主要的东西, 不过我感觉这样的传输, 可以让乱码问题集中到数据库层面, 就比较好解决了......