java web请求和响应中出现中文乱码问题的解析
说明:在计算机中保存的一切文本信息是以一定的编码表(0,1,0,1)来保存我们所认识的字符(汉字或英文字符),由字符到计算机存储的二进制过程是编码,由读取二进制到文本的过程称为解码。而字符编码有多种不同的编码表,所以,如果编码格式和解码格式不是同一个码表就会出现乱码。想要避免出现乱码,需要使保存和读取时使用相同的码表。
在javaweb编程中经常会出现乱码,现在详细讲解一下如何进行设置,避免乱码
1网页编码
在编写网页的时候,需要指定网页的编码格式,使用<metahttp-equiv="content-type"content="text/html;charset=UTF-8">来指定。此时浏览器读取或者发送请求的时候会以指定的编码格式保存或发送数据。在此是以utf-8形式。
例如代码片段:
<formaction="/Pro1/bb"method="post"> 用户名: <inputtype="text"name="username"><br> 性别: 男<inputtype="radio"name="gender"value="男"> 女<inputtype="radio"name="gender"value="女"><br> 喜欢的颜色:<br> 红<inputtype="checkbox"name="color"value="红"> 绿<inputtype="checkbox"name="color"value="绿"> 蓝<inputtype="checkbox"name="color"value="蓝"> <br>来自的国家 <selectname="country"> <optionvalue="中国">中国</option> <optionvalue="美国">美国</option> <optionvalue="日本">日本</option> </select> <br> <inputtype="submit"value="提交"> <inputtype="reset"value="重置"> </form>
2后端读取请求数据
在javaweb的servlet中要想获取请求的数据,需要将发送过来的二进制数据按照相应的码表进行解码才可以获取相应的人类可以读懂字符串。这个例子中是使用post方法,所以在处理post请求中,在获取有中文的请求参数前需要先设置编码格式,不然会出现乱码。因为服务器默认使用iso-8859-1编码表进行解码。
当然,如果想要在输出中输出中文字符,也需要使用统一的字符编码,此处是utf-8,代码如下
publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); PrintWriterout=response.getWriter(); Stringusername=request.getParameter("username"); Stringgender=request.getParameter("gender"); String[]colors=request.getParameterValues("color"); Stringcountry=request.getParameter("country"); out.println("<!DOCTYPEHTML>"); out.println("<HTML>"); out.println("<HEAD><TITLE>测试servlet</TITLE></HEAD>"); out.println("<BODY>"); out.print("<h1>以下是您的输入</h1>"); out.print("<p>"); out.print("您的用户名:"+username+"<br>"); out.print("您的性别:"+gender+"<br>"); out.print("您喜欢的颜色:"); for(Stringcr:colors){ out.print(cr+""); } out.print("<br>"); out.print("您的国家:"+country+"<br>"); out.print("</p>"); out.println("</BODY>"); out.println("</HTML>"); }
注意:此处的request.setCharacterEncoding("utf-8");只对请求实体的内容有效。post请求参数是存放在请求实体中,get方法的请求参数是放在url的后面以问号开始,‘&'连接多个参数。所以想要获取get方法的参数,需要使用手动解码,或者使用filter。
手动解码方法,为了简单起见只对性别进行解码,实际使用中需要对每一个参数进行解码:Stringgender=newString(req.getParameter("gender").getBytes("iso-8859-1"),"utf-8");
到此时就可以完美解决网页和服务器端出现汉字乱码的现象,记住一条,出现乱码的都是因为编码和解码使用不同编码表的原因,要使用相同的编码表,即可解决问题。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。