`
哈达f
  • 浏览: 115906 次
  • 性别: Icon_minigender_1
  • 来自: 广西
社区版块
存档分类
最新评论

getparameter()自动解码 以及 get类型详解

 
阅读更多

当我们想要在URL上传递中文参数的时候,我们需要进行URLEncode.code("中文参数"),然后才能在URL上正确的进行传递参数(注意:因为当我们提交表单的时候,表单中的参数也是会自动调用URLEncode.code("中文参数")为我们编码,这样就会产生一个%xy,xy是16进制的数据),所以当我们要在url上传递参数login?userName="中文参数",这事就应该这样写:

 

resp.sendRedirect("login?userName=" + URLEncoder.encode("犀利哥", "utf-8"));
//只用经过编码的中文才能正确的在url上传递参数。

 

当我们经过以上处理之后则可以在另一个响应页面获取数据,也就是req.getparameter("userName"),一般我们的做法是很自然的就是直接按照上面的方式去获取参数,然后在解码:

 

 

String userName = req.getparameter("userName");
System.out.prinln(URLDecode.code(userName,"UTF-8"));

 

 用以上的方式,想法是很好的,因为我们都是这样想的,在页面的一头去URLEncode.code("中文参数","UTF-8");去编码在接收页面用URLDecode.code("中文参数","UTF-8");去解码,然后都是按照UTF-8的格式去编码和解码,应该可以解码出正确的字符吧!!!但是结果却是这样的:

 

 

é????????

 

 是不是很失望,中文乱码!!!

回过头来看看其实我们都错了,其实错在我们都不明白,当我们使用req.getparameter("userName");的时候,服务器已经帮我们解码了,它是怎么解码的呢?

TOMCAT帮我们这样解码了URLDecode.code(userName,"ISO-8859-1")所以我们获得的是一个使用了UTF-8去编码,但是却是以ISO-8859-1

去解码的的文字,然后得出的文字能不是乱码吗?我们req.getparameter("userName");的时候所得到的已经是解码

过后的文字,所以我们再去解码,当然没有任何意义,因为已经不是%xy这种形式的数据,所以我们的解码是无意义的,

URLDecode.code()只会去解码%xy这样的数据),所以我们打印出来的就是乱码。那好,那要怎么解决呢?

这就是乱码的问题了,怎么解决乱码呢?因为服务器已经帮我们解码,而且是以ISO-8859-1解码的,所以我们要逆向

编码回去获得字节码也就是:

 

 

Bytes[] byte = req.getparameter("userName").getBytes("ISO-8859-1")//获得字节码
//然后再根据UTF去解码数据
String userName = new String(byte,"UTF-8" );
System.out.println(userName);
//这样 犀利哥 就出来了!

 

 通过以上步骤,就能正确的解码了,其实get的方式的乱码都是由上面产生的,了解了这个,也就了解了get方式产生乱码

的原因,也就能过顺利的解决get乱码问题。(记住get的方式与URL有关,而URL都要经过URLEncode和URLDecode)

 

其实对于get方式产生的乱码我们还可以通过更改服务的默认编码解码方式也就是在

 

  1. <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443"  
  2. URIEncoding="UTF-8" />  

 

这样以来get传递方式都是以UTF-8编码方式去编码了!

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics