您的位置:首页 > 其它

解决表单get提交乱码问题

2012-09-27 18:14 309 查看


解决表单get提交乱码问题

Posted on 2012
年 3 月 15 日 by jsper.org

客户端提交数据到服务有两种方式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.

轉載自:http://www.jsper.org/%E8%A7%A3%E5%86%B3%E8%A1%A8%E5%8D%95get%E6%8F%90%E4%BA%A4%E4%B9%B1%E7%A0%81%E9%97%AE%E9%A2%98/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: