首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

乱码有关问题解决详解

2012-10-18 
乱码问题解决详解编码的时候不能错,错了就拿不回来数据了,比如;String name new String(犀利.getBytes

乱码问题解决详解

编码的时候不能错,错了就拿不回来数据了,比如;String name = new String("犀利".getBytes("ISO-8859-1"));

编码的时候就错了,用的是ISO-8859-1,这样的Bytes数据是不可取的,不管以什么编码去解析,都不能取回犀利。

所以能解决乱码的问题必须是第一步编码正确:如

?

?

Java代码?
  1. String?name?=?new?String("犀利".getBytes("GBK"),"ISO-8859-1");??
  2. name?=?new?String(name.getBytes("ISO-8859-1"),"GBK");??

?

?这样就能正确的显示出犀利。上面的编码正确,然后用的是ISO-8859-1去解码。所以第一次解码得出的name是乱码,于是我们把得到的name乱码再次以ISO-8859-1去编码,逆向回去,得到的是GBK的Byte编码数据,然后再按照正确的对应的GBK编码方式解码,所以就能得到犀利。

?

看看我们的乱码问题:第一个页面:

?

Java代码?
  1. package?com.servlet;??
  2. ??
  3. import?java.io.IOException;??
  4. import?java.io.PrintWriter;??
  5. ??
  6. import?javax.servlet.ServletException;??
  7. import?javax.servlet.http.HttpServlet;??
  8. import?javax.servlet.http.HttpServletRequest;??
  9. import?javax.servlet.http.HttpServletResponse;??
  10. ??
  11. @SuppressWarnings("serial")??
  12. public?class?Login?extends?HttpServlet?{??
  13. ??
  14. ????@Override??
  15. ????protected?void?doGet(HttpServletRequest?req,?HttpServletResponse?resp)??
  16. ????????????throws?ServletException,?IOException?{??
  17. ????????//?TODO?Auto-generated?method?stub??
  18. ????????doPost(req,?resp);??
  19. ????}??
  20. ??
  21. ????@Override??
  22. ????protected?void?doPost(HttpServletRequest?req,?HttpServletResponse?resp)??
  23. ????????????throws?ServletException,?IOException?{??
  24. ??????????
  25. ????????resp.setContentType("text/html;charset=utf-8");??
  26. /*页面的编码我们设置成为了UTF-8,所以当我们提交表单的时候get的数据自然也就按照UTF-8的编码方?
  27. 式去编码也就是相当于"数据".getBytes("ISO-8859-1")?然后获得字节流数据,然后在网络上进行传递,?
  28. 也就是action到了里一个页面。*/??
  29. ??
  30. ????????PrintWriter?pw?=?resp.getWriter();??
  31. ??
  32. ????????pw.println("<html>");??
  33. ????????pw.println("<body>");??
  34. ????????pw.println("<form?action=check?method='get'>");??
  35. ????????pw.println("用户名:<input?type='text'?name='userName'/><br/>");??
  36. ????????pw.println("密?????码:<input?type='password'?name='passW'/><br/>");??
  37. ????????pw.println("<input?type=submit?value='提?????交'/>");??
  38. ????????pw.println("</form>");??
  39. ????????pw.println("</body>");??
  40. ????????pw.println("</html>");??
  41. ????}??
  42. }??

?

?第二个页面:

?

Java代码?
  1. package?com.servlet;??
  2. ??
  3. import?java.io.IOException;??
  4. import?java.sql.Connection;??
  5. import?java.sql.PreparedStatement;??
  6. import?java.sql.ResultSet;??
  7. import?java.sql.SQLException;??
  8. ??
  9. import?javax.servlet.ServletException;??
  10. import?javax.servlet.http.HttpServlet;??
  11. import?javax.servlet.http.HttpServletRequest;??
  12. import?javax.servlet.http.HttpServletResponse;??
  13. import?javax.servlet.http.HttpSession;??
  14. ??
  15. public?class?CheckLg?extends?HttpServlet?{??
  16. ??
  17. ????/**?
  18. ?????*??
  19. ?????*/??
  20. ????private?static?final?long?serialVersionUID?=?7384793825684059007L;??
  21. ??
  22. ????@Override??
  23. ????protected?void?doGet(HttpServletRequest?req,?HttpServletResponse?resp)??
  24. ????????????throws?ServletException,?IOException?{??
  25. ????????//?TODO?Auto-generated?method?stub??
  26. ????????doPost(req,?resp);??
  27. ????}??
  28. ??
  29. ????@Override??
  30. ????protected?void?doPost(HttpServletRequest?req,?HttpServletResponse?resp)??
  31. ????????????throws?ServletException,?IOException?{??
  32. ????????//?TODO?Auto-generated?method?stub??
  33. ????????Connection?con;??
  34. ????????PreparedStatement?pst;??
  35. ????????ResultSet?rs;??
  36. ??
  37. ????????resp.setContentType("text/html;charset=utf-8");??
  38. ????????String?userName?=?new?String(req.getParameter("userName").getBytes(??
  39. ????????????????"ISO-8859-1"),?"GBK");??
  40. /*由于tomcat的默认的解码方式是ISO-8859-1,所以我们要以ISO-8859-1逆向编码,然后获得?
  41. 以UTF-8编码的字节数组,得到字节数组后,我们就可以去解码了,用什么来解码呢?因为是UTF-8的?
  42. 的方式去编码,所以必须以Utf-8的方式去解码!这里我们却用了GBK解码,所以解码出来的是乱码!*/??
  43. ????????System.out.println("--------"+userName+"----------");??
  44. ??????????
  45. <span?style="white-space:?pre;">????</span>}??
  46. }??

?

对于sendRedirect的乱码问题是这样解决的:

?

?

Java代码?
  1. String?infos?=?URLEncoder.encode("请重新登录","utf-8");??
  2. resp.sendRedirect("login?info="+infos);??

?先用URLEncoder去编码,并且指定编码的编码表如UTF-8

?

当第二页面接收到数据的时候就会自动的URLDecoder得到我们的字节流数据,然后tomcat又根据自己的对get的方法的ISO-8895-1去解码,所以产生了乱码,

这个时候我们就要重新以ISO-8859-1去解码,获得之前的字节数组,然后再进行正确的UTF-8编码则得到正确的结果。

?

?

Java代码?
  1. String?info?=?req.getParameter("info");??
  2. String?erro=?new?String(info.getBytes("ISO-8859-1"),?"UTF-8");??
至于post类型的方法处理乱码很简单.........

热点排行