`
哈达f
  • 浏览: 115258 次
  • 性别: Icon_minigender_1
  • 来自: 广西
社区版块
存档分类
最新评论

乱码问题解决详解

 
阅读更多

编码的时候不能错,错了就拿不回来数据了,比如;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类型的方法处理乱码很简单.........

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics