java web中请求和响应中包含中文出现乱码解析
1 网页编码
在编写网页的时候,需要指定网页的编码格式,使用来指定。此时浏览器读取或者发送请求的时候会以指定的编码格式保存或发送数据。在此是以utf-8形式。
例如代码片段:
2 后端读取请求数据
在java web的servlet中要想获取请求的数据,需要将发送过来的二进制数据按照相应的码表进行解码才可以获取相应的人类可以读懂字符串。这个例子中是使用post方法,所以在处理post请求中,在获取有中文的请求参数前需要先设置编码格式,不然会出现乱码。因为服务器默认使用iso-8859-1编码表进行解码。
当然,如果想要在输出中输出中文字符,也需要使用统一的字符编码,此处是utf-8,代码如下
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); String username = request.getParameter("username"); String gender = request.getParameter("gender"); String[] colors = request.getParameterValues("color"); String country = request.getParameter("country"); out.println(""); out.println(""); out.println("测试servlet "); out.println(" "); out.print("以下是您的输入
"); out.print(""); out.print("您的用户名:"+username+"
"); out.println(" "); out.println(""); }
"); out.print("您的性别:"+gender+"
"); out.print("您喜欢的颜色:"); for(String cr:colors){ out.print(cr+" "); } out.print("
"); out.print("您的国家:"+country+"
"); out.print("
注意:此处的request.setCharacterEncoding("utf-8");只对请求实体的内容有效。post请求参数是存放在请求实体中,get方法的请求参数是放在url的后面以问号开始,‘&’连接多个参数。所以想要获取get方法的参数,需要使用手动解码,或者使用filter。
手动解码方法,为了简单起见只对性别进行解码,实际使用中需要对每一个参数进行解码:String gender = new String(req.getParameter("gender").getBytes("iso-8859-1"),"utf-8") ;
到此时就可以完美解决网页和服务器端出现汉字乱码的现象,记住一条,出现乱码的都是因为编码和解码使用不同编码表的原因,要使用相同的编码表,即可解决问题。
上一篇: JavaMail邮件开发