jsp页面中 <meta http-equiv="content-type" content="text/html; charset=UTF-8">通知浏览器以utf-8解码
get请求编码方式和post请求提交编码方式不同,get是把数据直接放到url中,例如以上的uname,IE浏览器先对中文进行utf-8编码(一个中文3个字符表示 太长),继而为了缩短字符又用ISO8859-1编码后传递给服务器。服务器的doGet方法中要先进行ISO8859-1解码再utf-8解码才能看到中文。
而post请求则在浏览器端把数据以utf-8的形式存储到http的请求体中,不用通过url传输,继而只要 request.setCharacterEncoding("utf-8");通知request以utf-8形式解码就行,因为request默认以ISO8859-1进行解码的。
使用代码解决乱码问题
1 public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { 2 // 处理响应数据的格式和编码,通知浏览器数据的显示方式 3 response.setCharacterEncoding("utf-8"); 4 response.setContentType("text/html;charset=utf-8"); 5 // 获取字符输出流对象 6 PrintWriter out = response.getWriter(); 7 // 获取请求参数 8 String name = request.getParameter("uname"); 9 String address = request.getParameter("address"); 10 // 获取ISO8859-1的原始数据 11 byte [] bs = name.getBytes("ISO8859-1"); //内部编码字节流,其实中文字符经过utf-8编码后的字节 都是英文可以表示的,只是 //ISO8859-1显示数据以一个字节一个字节显示,而utf-8以几个字节一起表示 12 name = new String(bs,"UTF-8"); 13 bs = address.getBytes("ISO8859-1"); 14 address = new String(bs,"UTF-8"); 15 // 输出数据 16 out.println("name="+name); 17 out.println("<br/>"); 18 out.println("address="+address); 19 }
如果使用以上的代码解决GET乱码每一个请求参数都需要重新的解码太繁琐,因此可以直接使用服务器通知浏览器以指定的方式进行编码字符数据。
使用URIEnoding方式解决GET乱码问题
1 <Connector port="8080" protocol="HTTP/1.1" 2 connectionTimeout="20000" 3 redirectPort="8443" 4 URIEncoding="utf-8"/>
URIEncoding主要指定的是%E5%8D%A1%E5%8D%A1的数据的解码方式,如果没有指定那么默认是ISO8859-1,如果指定那么采用指定的码表进行解码。因此服务器端就没有必要使用两个中编码方式进行转码了。
注意:在实际的生产环境中我们代码的乱码问题不可能以来服务器帮助我们解决,因此推荐使用第一个转码方式。后期可以直接实现一个乱码的过滤器实现处理乱码的问题。