欢迎来到天天文库
浏览记录
ID:8907221
大小:116.50 KB
页数:8页
时间:2018-04-11
《中间件字符乱码问题》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、字符集转换解决方案问题的提出:关于字符串的字符集转换,目前应用系统中主要在对数据库操作的时候。1.向数据提交操作请求会对每一个String类型的变量做一次GBKToUnicode的操作,实际上此操作最终会触发unicodeToGBK操作,而在unicodeToGBK中会调用isGBKString方法用来判定此字符串是否是GBK编码,采用的方式是循环比较字符串数组中的每一个char对象值。2.从数据库返回数据信息会对每一个String类型做一次unicodeToGBK的操作,同样会调用isGBKSt
2、ring方法。由于上述操作导致应用服务器的性能产生很大的负载,因此需要及时改进。已经解决的问题:对于从数据库返回数据信息而做的unicodeToGBK操作,我们主要是在schema的getString时调用,及exesql中的getdatavalue中调用。Schema中的调用我们通过一个静态变量SysConst.CHANGECHARSET来控制是否执行(目前默认情况下是不执行),而exesql中的调用是强制执行的。经过民生的近期测试,我们发现可以去掉exesql中的unicodeToGBK操作,
3、而保证数据在返回到前台的时候没有乱码。尚未解决的问题:对于向数据提交操作请求而做的GBKToUnicode的操作,实际上此操作也依赖于SysConst.CHANGECHARSET变量l如果此变量为true则执行newString(strOriginal.getBytes("GBK"),"ISO8859_1");l如果此变量为false则执行newString(strOriginal.getBytes("ISO8859_1"),"GBK");现在系统中SysConst.CHANGECHARSET默认
4、设置为false,而不论此变量为何值,系统都会执行isGBKString这个操作。问题:如果我们去除这一操作,会导致提交到后台数据库中的中文全部变成??的形式,在查询的时候,也无法使用中文作为查询条件。以前的存储方式:以前的应用是通过unicodeToGBK进行转换,提交给数据库的时候,字符集的编码采用的是GBK。之所以当初要在后台统一字符集处理,是因为无法有效保证前台提交过来的信息编码格式。问题分析:产生上述情况的原因是Jsp/Servlet不能接收form提交的汉字,也不能解析通过get方式传
5、递的汉字。运行于Java应用服务器的JSP/Servlet为Browser提供HTML内容,其过程如下图所示:其中有字符编码转换的地方有:lJSP编译。Java应用服务器将根据JVM的file.encoding值读取JSP源文件,编译生成JAVA源文件,再根据file.encoding值写回文件系统。如果当前系统语言支持GBK,那么这时候不会出现encoding问题。如果是英文的系统,如LANG是en_US的Linux,AIX或Solaris,则要将JVM的file.encoding值置成GBK。
6、系统语言如果是GB2312,则根据需要,确定要不要设置file.encoding,将file.encoding设为GBK可以解决潜在的GBK字符乱码问题lJava需要被编译为.class才能在JVM中执行,这个过程存在与a.同样的file.encoding问题。从这里开始servlet和jsp的运行就类似了,只不过Servlet的编译不是自动进行的。对于JSP程序,对产生的JAVA中间文件的编译是自动进行的(在程序中直接调用sun.tools.javac.Main类).因此如果在这一步出现问题的话
7、,也要检查encoding和OS的语言环境,或者将内嵌在JSPJAVACode中的静态汉字转为Unicode,要么静态文本输出不要放在JAVAcode中。对于Servlet,javac编译时手工指定-encoding参数就可以了。lServlet需要将HTML页面内容转换为browser可接受的encoding内容发送出去。依赖于各JAVAAppServer的实现方式,有的将查询Browser的accept-charset和accept-language参数或以其它猜的方式确定encoding值,
8、有的则不管。因此采用固定encoding也许是最好的解决方法。对于中文网页,可在JSP或Servlet中设置contentType="text/html;charset=GB2312";如果页面中有GBK字符,则设置为contentType="text/html;charset=GBK",由于IE和Netscape对GBK的支持程度不一样,作这种设置时需要测试一下。因为16位JAVAchar在网络传送时高8位会被丢弃,也为了确保Servlet页面中的汉字(包括内嵌的和servlet
此文档下载收益归作者所有