Java乱码解决之道

                                                                              jsp 网站优化----”乱码无处可逃"

        很多和我一样开发jsp网站的朋友曾经遇到过很蛋疼的问题,往数据库写入的数据出现了乱码,我的天啊!my god。

很多朋友可能想到和我一样的办法:

第一种:

1修改数据库编码方式  2 在每个jsp 页面修改和数据库一样的编码(非常蛋疼)

第二种:

1 在web.xml文件中添加过滤器 , 这个不熟悉也非常的难配置(出错更难缠)

 

下面的代码让你不再担心乱码的棘手


这些说明不同编码方式所占的字节
gb2312,gbk 中文两个字节,英文一个字节
在中文系统中ansi一般指gb2312或gbk
GB2312、GBK都属于双字节字符集 (DBCS)
Utf-8 中文三个字节,英文一个字节
Unicode 中文两个字节,英文两个字节


代码如下:
public static boolean isValidUtf8(byte[] b,int aMaxCount){


       int lLen=b.length,lCharCount=0;


       for(int i=0;i<lLen && lCharCount<aMaxCount;++lCharCount){


              byte lByte=b[i++];//to fast operation, ++ now, ready for the following for(;;)


              if(lByte>=0) continue;//>=0 is normal ascii


              if(lByte<(byte)0xc0 || lByte>(byte)0xfd) return false;


              int lCount=lByte>(byte)0xfc?5:lByte>(byte)0xf8?4


                     :lByte>(byte)0xf0?3:lByte>(byte)0xe0?2:1;


              if(i+lCount>lLen) return false;


              for(int j=0;j<lCount;++j,++i) if(b[i]>=(byte)0xc0) return false;


       }

       return true;
}



下面是来此网上其他的解决方案

l 没有包括对用户默认编码的识别,这可以根据请求信息的语言来判断,但不一定正确,因为我们有时候也会输入一些韩文,或者其他文字。


l 可能会错误判断UTF-8字符,一个例子是"学习"两个字,其GBK编码是" \xd1\xa7\xcf\xb0",如果使用上述isValidUtf8方法判断,将返回true。可以考虑使用更严格的判断方法,不过估计效果不大。


有一个例子可以证明google也遇到了上述问题,而且也采用了和上述相似的处理方法,比如,如果在地址栏中输入"http://www.google.com/search?hl=zh-CN&newwindow=1&q=学习",google将无法正确识别,而其他汉字一般能够正常识别。


最后,应该补充说明一下,如果不使用rewrite规则,或者通过表单提交数据,其实并不一定会遇到上述问题,因为这时可以在提交数据时指定希望的编码。另外,中文文件名确实会带来问题,应该谨慎使用。


6. 其它


下面描述一些和编码有关的其他问题。


6.1. SecureCRT


除了浏览器和控制台与编码有关外,一些客户端也很有关系。比如在使用SecureCRT连接linux时,应该让SecureCRT的显示编码(不同的session,可以有不同的编码设置)和linux的编码环境变量保持一致。否则看到的一些帮助信息,就可能是乱码。


另外,mysql有自己的编码设置,也应该保持和SecureCRT的显示编码一致。否则通过SecureCRT执行sql语句的时候,可能无法处理中文字符,查询结果也会出现乱码。


对于Utf-8文件,很多编辑器(比如记事本)会在文件开头增加三个不可见的标志字节,如果作为mysql的输入文件,则必须要去掉这三个字符。(用linux的vi保存可以去掉这三个字符)。一个有趣的现象是,在中文windows下,创建一个新txt文件,用记事本打开,输入"连通"两个字,保存,再打开,你会发现两个字没了,只留下一个小黑点。


6.2. 过滤器


如果需要统一设置编码,则通过filter进行设置是个不错的选择。在filter class中,可以统一为需要的请求或者回应设置编码。参加上述setCharacterEncoding()。这个类apache已经给出了可以直接使用的例子SetCharacterEncodingFilter。

发布了33 篇原创文章 · 获赞 4 · 访问量 8万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章