乱码有关问题解决详解
乱码问题解决详解编码的时候不能错,错了就拿不回来数据了,比如;String name new String(犀利.getBytes
乱码问题解决详解
编码的时候不能错,错了就拿不回来数据了,比如;String name = new String("犀利".getBytes("ISO-8859-1"));
编码的时候就错了,用的是ISO-8859-1,这样的Bytes数据是不可取的,不管以什么编码去解析,都不能取回犀利。
所以能解决乱码的问题必须是第一步编码正确:如
?
?
Java代码?
- String?name?=?new?String("犀利".getBytes("GBK"),"ISO-8859-1");??
- name?=?new?String(name.getBytes("ISO-8859-1"),"GBK");??
?
?这样就能正确的显示出犀利。上面的编码正确,然后用的是ISO-8859-1去解码。所以第一次解码得出的name是乱码,于是我们把得到的name乱码再次以ISO-8859-1去编码,逆向回去,得到的是GBK的Byte编码数据,然后再按照正确的对应的GBK编码方式解码,所以就能得到犀利。
?
看看我们的乱码问题:第一个页面:
?
Java代码?
- package?com.servlet;??
- ??
- import?java.io.IOException;??
- import?java.io.PrintWriter;??
- ??
- import?javax.servlet.ServletException;??
- import?javax.servlet.http.HttpServlet;??
- import?javax.servlet.http.HttpServletRequest;??
- import?javax.servlet.http.HttpServletResponse;??
- ??
- @SuppressWarnings("serial")??
- public?class?Login?extends?HttpServlet?{??
- ??
- ????@Override??
- ????protected?void?doGet(HttpServletRequest?req,?HttpServletResponse?resp)??
- ????????????throws?ServletException,?IOException?{??
- ????????//?TODO?Auto-generated?method?stub??
- ????????doPost(req,?resp);??
- ????}??
- ??
- ????@Override??
- ????protected?void?doPost(HttpServletRequest?req,?HttpServletResponse?resp)??
- ????????????throws?ServletException,?IOException?{??
- ??????????
- ????????resp.setContentType("text/html;charset=utf-8");??
- /*页面的编码我们设置成为了UTF-8,所以当我们提交表单的时候get的数据自然也就按照UTF-8的编码方?
- 式去编码也就是相当于"数据".getBytes("ISO-8859-1")?然后获得字节流数据,然后在网络上进行传递,?
- 也就是action到了里一个页面。*/??
- ??
- ????????PrintWriter?pw?=?resp.getWriter();??
- ??
- ????????pw.println("<html>");??
- ????????pw.println("<body>");??
- ????????pw.println("<form?action=check?method='get'>");??
- ????????pw.println("用户名:<input?type='text'?name='userName'/><br/>");??
- ????????pw.println("密?????码:<input?type='password'?name='passW'/><br/>");??
- ????????pw.println("<input?type=submit?value='提?????交'/>");??
- ????????pw.println("</form>");??
- ????????pw.println("</body>");??
- ????????pw.println("</html>");??
- ????}??
- }??
?
?第二个页面:
?
Java代码?
- package?com.servlet;??
- ??
- import?java.io.IOException;??
- import?java.sql.Connection;??
- import?java.sql.PreparedStatement;??
- import?java.sql.ResultSet;??
- import?java.sql.SQLException;??
- ??
- import?javax.servlet.ServletException;??
- import?javax.servlet.http.HttpServlet;??
- import?javax.servlet.http.HttpServletRequest;??
- import?javax.servlet.http.HttpServletResponse;??
- import?javax.servlet.http.HttpSession;??
- ??
- public?class?CheckLg?extends?HttpServlet?{??
- ??
- ????/**?
- ?????*??
- ?????*/??
- ????private?static?final?long?serialVersionUID?=?7384793825684059007L;??
- ??
- ????@Override??
- ????protected?void?doGet(HttpServletRequest?req,?HttpServletResponse?resp)??
- ????????????throws?ServletException,?IOException?{??
- ????????//?TODO?Auto-generated?method?stub??
- ????????doPost(req,?resp);??
- ????}??
- ??
- ????@Override??
- ????protected?void?doPost(HttpServletRequest?req,?HttpServletResponse?resp)??
- ????????????throws?ServletException,?IOException?{??
- ????????//?TODO?Auto-generated?method?stub??
- ????????Connection?con;??
- ????????PreparedStatement?pst;??
- ????????ResultSet?rs;??
- ??
- ????????resp.setContentType("text/html;charset=utf-8");??
- ????????String?userName?=?new?String(req.getParameter("userName").getBytes(??
- ????????????????"ISO-8859-1"),?"GBK");??
- /*由于tomcat的默认的解码方式是ISO-8859-1,所以我们要以ISO-8859-1逆向编码,然后获得?
- 以UTF-8编码的字节数组,得到字节数组后,我们就可以去解码了,用什么来解码呢?因为是UTF-8的?
- 的方式去编码,所以必须以Utf-8的方式去解码!这里我们却用了GBK解码,所以解码出来的是乱码!*/??
- ????????System.out.println("--------"+userName+"----------");??
- ??????????
- <span?style="white-space:?pre;">????</span>}??
- }??
?
对于sendRedirect的乱码问题是这样解决的:
?
?
Java代码?
- String?infos?=?URLEncoder.encode("请重新登录","utf-8");??
- resp.sendRedirect("login?info="+infos);??
?先用URLEncoder去编码,并且指定编码的编码表如UTF-8
?
当第二页面接收到数据的时候就会自动的URLDecoder得到我们的字节流数据,然后tomcat又根据自己的对get的方法的ISO-8895-1去解码,所以产生了乱码,
这个时候我们就要重新以ISO-8859-1去解码,获得之前的字节数组,然后再进行正确的UTF-8编码则得到正确的结果。
?
?
Java代码?
- String?info?=?req.getParameter("info");??
- String?erro=?new?String(info.getBytes("ISO-8859-1"),?"UTF-8");??
至于post类型的方法处理乱码很简单.........