Posted on 2011-03-02 15:51
landor 阅读(552)
评论(0) 编辑 收藏 所属分类:
jsp、servlet 、
ajax
1 浏览器会根据content="text/html; charset=gbk"来解析该用什么编码来把这些字节流decode成字符串,并显示;
2 当客户端提交表单的时候,比如以post方式提交,浏览器同样会根据上面的编码,把这些字符串encode成字节流,发送到服务端;
3 在服务端,默认就会认为传过来的东西就是ASCii码,没别的,也就是ISO-8859-1,所以它就去decode,ISO-8859-1中根本没有中文汉字对应的二进制码,没找到,就乱了应该是一堆口吧;
4 解决办法是加一个过滤器,比如gbk,那就设置成request.setCharacterEncoding("GBK");这样服务端在获取字符串的时候,就用GBK去decode这个二进制流了;
5 如果是ajax,问题又来了,因为ajax只支持utf-8编码格式,过程应该是这样:
a 浏览器通过ajax像server端post数据时,ajax自动将浏览器中的文字用utf-8 encode成二进制流,然后发送到server端;
b server端如果配置的filter是gbk,那么会用gbk去decode这个二进制流,显然乱麻;但是不应该是一堆口,因为他应该根据二进制流的每两位字节,在GBK编码表中能找到对应的内容,具体的内容是简体文字还是繁体文字还是其他的,就不一定了;
此时要是偶数个汉字还好(可以把它用gbk进行encode,然后用utf-8进行decode,这样就还原回来了),
如果是奇数个汉字就出现丢失了(因为一个字符用UTF-8 encode后为3个字节,如果三个字符被encode之后,就是9个字节,当用gbk进行decode 的时候,gbk是用2个字节,结果剩下了一个字节,这个字节在gbk的编码表中不存在(因为gbk编码表都是2个字节的),所以就用?号填充了)。
c 所以必须在服务端的fiter中对ajax请求进行判断,用jquery为例:
$.ajax({
contentType:"application/x-www-form-urlencoded;charset=utf-8",
在server端的filter中,可以判断charset是不是空,如果加上上面的代码,那么charset就是utf-8,代码如下:
if (request.getCharacterEncoding() == null) {
request.setCharacterEncoding(this.encoding);//正常提交请求时候,charset是空的,也就是说request.getCharacterEncoding()是空的;
}