解决表单get提交乱码问题
客户端提交数据到服务有两种方式GET和POST
1.get方式
数据直接在url上进行拼接,使用&分隔key-value对.
但有时key,value会出现中文等对于html标准来说不安全的字符
html标准说
除了字符”a”-”z”,”A”-”Z”,”0″-”9″,”.”,”-”,”*”,和”_” 其他的字符都是不安全的,需要进行编码.其中” “空格会被编码成+号
当出现不安全字符时,在发送到服务器之前,浏览器会将这些参数值进行编码,一般推荐是使用utf-8编码格式.
字符被转换为1个或者多个字节,然后每个字节都被表示成”%xy”格式的由3个字符组成的字符串,xy是字节的2位16进制的表示.
也可以使用javascript对数据进行encodeURIComponent(url);
现在的url就成了ASCII范围内的字符了,然后以iso-8859-1的编码方式转换成二进制随着请求头一起发送出去,对于get方法来说,没有请求实体,含有数据的url都在请求头里面
请注意,其实这里进行了两次编码,第一次是使用UTF8,第二次使用iso-8859-1编码成能在网络上传输二进制101010….
现在问题来到了服务器端,每种服务器默认的编码方式都可能不同,比如tomcat默认编码就是iso-8859-1, 而resin默认编码是utf-8
按道理服务器端也会做两次的解码动作,第一次是对二进制内容的iso-8859-1的解码,第二次是使用服务器默认的编码对数据进行解码,
因此我们使用request.getParameter(“name”)得到的数据是经过两次解码的.
当tomcat使用iso-8859-1对数据进行第二次解码时,因为对应客户端编码是utf8,
因此我们使用request.getParameter(“name”)就肯定乱码.
如果我们不去改变tomcat的默认编码,可以使用
new String(request.getParameter(“name”).getBytes(“iso-8859-1″), “utf-8″);手工重新解码.
request.setCharacterEncoding(“utf-8″)这种方式对于get方式提交数据是无效的,
但是对post方式提交数据却是有效的.因为get没有request body.
通常的做法还是修改tomcat的默认编码:
在server.xml中的connector加上URIEncoding=”UTF-8″即可
2.post方式
post方式提交的数据也是必须进行编码的.
如果form所在html文件指定了编码,就使用那个编码进行url编码.
总结:为了防止出现乱码,一般系统相关的文件都设成utf8格式,web服务器,java服务器,数据库的编码格式都设为utf8.这样一般比较少出现乱码问题.
还有就是尽量使用post方式提交数据,一个是因为url的长度是有限制的,而get方式是将数据拼接到url上的.
This entry was posted in 问题与解决. Bookmark the permalink.