你的位置:首页 > Java教程

[Java教程]java web中请求和响应中包含中文出现乱码解析


说明:在计算机中保存的一切文本信息是以一定的编码表(0,1,0,1)来保存我们所认识的字符(汉字或英文字符),由字符到计算机存储的二进制过程是编码,由读取二进制到文本的过程称为解码。而字符编码有多种不同的编码表,所以,如果编码格式和解码格式不是同一个码表就会出现乱码。想要避免出现乱码,需要使保存和读取时使用相同的码表。

 

在java web编程中经常会出现乱码,现在详细讲解一下如何进行设置,避免乱码

 

1 网页编码

  在编写网页的时候,需要指定网页的编码格式,使用<meta http-equiv="content-type" content="text/html; charset=UTF-8">来指定。此时浏览器读取或者发送请求的时候会以指定的编码格式保存或发送数据。在此是以utf-8形式。

  例如代码片段:

  <form action="/Pro1/bb" method="post">    用户名:    <input type="text" name="username" ><br>        性别:    男<input type="radio" name="gender" value="男">&nbsp;女<input type="radio" name="gender" value="女"><br>        喜欢的颜色:<br>    红<input type="checkbox" name="color" value="红">&nbsp;&nbsp; 绿<input type="checkbox" name="color" value="绿">&nbsp;&nbsp;    蓝<input type="checkbox" name="color" value="蓝">         <br>来自的国家     <select name="country">      <option value="中国">中国</option>      <option value="美国">美国</option>      <option value="日本">日本</option>    </select>        <br>    <input type="submit" value="提交">&nbsp;    <input type="reset" value="重置">          </form>

 

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("<!DOCTYPE HTML>");    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(String cr: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。

  手动解码方法,为了简单起见只对性别进行解码,实际使用中需要对每一个参数进行解码:String gender = new String(req.getParameter("gender").getBytes("iso-8859-1"),"utf-8") ;

到此时就可以完美解决网页和服务器端出现汉字乱码的现象,记住一条,出现乱码的都是因为编码和解码使用不同编码表的原因,要使用相同的编码表,即可解决问题。

 




深圳一日游攻略大全深圳游玩攻略大全深圳有哪些旅游景点好深圳有什么好玩的地方深圳自助游景点攻略大全福州桃花朵朵开 依傍枝头等君来 2015广州鳄鱼公园三八妇女节优惠活动?广州长隆鳄鱼公园3.8女士半价时间? 2015长隆欢乐世界三八妇女节女士优惠吗?广州长隆欢乐世界3.8门票优惠活动? 2015长隆欢乐世界三八妇女节女士半价多少?广州长隆欢乐世界3.8女性门票价格? 西安十大“约会胜地”推荐 大唐芙蓉园 反季旅行吧 我们要去安静的海岛[二] 进去出不来 全球最著名的五大迷宫[五] 当范思哲的浓妆碰上了一瓶酒 韶关市华南虎动物园在哪里?华南虎动物园旅游攻略? 2015星光大道广州海选什么时候?星光大道广州海选地区在哪里? 2015国庆节放假几天? 广州星光大道海选活动地点?广州星光大道海选什么时候开始? 川洞有什么好玩的?天峨县川洞在哪里? 融水雨卜苗寨是通票吗?雨卜苗寨门票包括什么项目? 融水雨卜苗寨门票预约电话?雨卜苗寨预订优惠多少? 融水雨卜苗寨网上购票?雨卜苗寨怎么预约? SFH325 Datasheet SFH325 Datasheet SFH325 FA Datasheet SFH325 FA Datasheet SFH325 FA-3 Datasheet SFH325 FA-3 Datasheet 德庆盘龙峡漂流 德庆盘龙峡漂流 德庆盘龙峡漂流 青青世界团购 青青世界团购 青青世界团购 实惠购物 实惠购物 实惠购物