欢迎访问北大青鸟鲁广校区~

  1. 加入收藏
  2. 设为主页
  3. 学校简介

三分钟了解北大青鸟

×
  • 北大青鸟大数据课程
  • 北大青鸟网络工程师
  • 北大青鸟web设计专业
  • 北大青鸟PHP专业
  • 北大青鸟启蒙星课程

Java WEB开发中的中文乱码问题解决

责任编辑:武汉宏鹏来源:北大青鸟鲁广校区Java技术教程发布时间:2013-08-15 10:40
导读:本文旨在探讨解决Java WEB开发中的中文乱码问题。

本文所有范例以UTF-8为例。大家可以根据自己的情况加以替换。

在开始本文之前,假设本文的读者已经熟悉或了解以下技术:
- Java语法
- Java WEB开发的基本概念
- Jsp
- Servlet
- 至少一种支持JSP/SERVLET的Web服务器(包括安装,运行)
浏览器/WEB服务器之间的参数传递原理分析
浏览器/WEB服务器之间的中文参数传递
1,表单(form)中文参数的传递方法。我们使用一个简单的范例说明表单提交时浏览器的对中文参数的处理。
1. SubmitAsia.html  
2. view plaincopy to clipboardprint?  
3. <html>      
4. <head>      
5. <meta http-equiv="content-type" content="text/html; charset=UTF-8">      
6. </head>    
7. <body>      
8. <form method="get">      
9. <input type="text" name="userName" id="userName"> <input type="submit" value="submit" />      
10. </form>      
11. </body>      
12. </html>     
13. <html> 
14. <head> 
15. <meta http-equiv="content-type" content="text/html; charset=UTF-8"> 
16. </head> 
17. <body> 
18. <form method="get"> 
19. <input type="text" name="userName" id="userName"> <input type="submit" value="submit" /> 
20. </form> 
21. </body> 
22. </html> 
使用任意浏览器打开该文件,在输入框内输入 “你好” 中文2字,然后按submit按钮,我们注意到浏览器的地址栏:
file:///C:/SubmitAsia.html?userName=%E4%BD%A0%E5%A5%BD
刚才输入“你好”二字,被转换为 %E4%BD%A0%E5%A5%BD 后被发往服务器。
这个 %E4%BD%A0%E5%A5%BD 是什么呢?
我们先使用一个Java程序来测试一下。如下:
1. EnDecoderUtil.java  
2. view plaincopy to clipboardprint?  
3. import java.io.IOException;      
4. import java.io.UnsupportedEncodingException;      
5. import java.net.URLDecoder;      
6. import java.net.URLEncoder;      
7.      
8. public class EnDecoderUtil {      
9.     public static void main(String []args) {      
10.         try {      
11.              String str = URLEncoder.encode("你好", "UTF-8");      
12.              System.out.println(str);      
13.              str = URLDecoder.decode(str, "UTF-8");      
14.              System.out.println(str);      
15.      
16.          } catch (UnsupportedEncodingException e) {      
17.              e.printStackTrace();      
18.          }      
19.      }      
20. }     
21.  
22. import java.io.IOException;  
23. import java.io.UnsupportedEncodingException;  
24. import java.net.URLDecoder;  
25. import java.net.URLEncoder;  
26.  
27. public class EnDecoderUtil {  
28.      public static void main(String []args) {  
29.          try {  
30.              String str = URLEncoder.encode("你好", "UTF-8");  
31.              System.out.println(str);  
32.              str = URLDecoder.decode(str, "UTF-8");  
33.              System.out.println(str);  
34.  
35.          } catch (UnsupportedEncodingException e) {  
36.              e.printStackTrace();  
37.          }  
38.      }  
39. }

编译执行:
c:\>javac EnDecoderUtil.java
c:\>java EnDecoderUtil
%E4%BD%A0%E5%A5%BD
你好
我们发现,浏览器发送给服务器的“你好”中文参数跟使用java.net.URLEncoder.encode()方法编码后的值完一样。
原来,浏览器在向服务器传递参数时,对于非数字,非英文的字符(比如中日韩文)时,会先将其加以变换(编码),再发送给服务器,服务器接收到这种格式的字符时,会将其反向编码,还原成原来的字符。
浏览器/Java WEB服务器之间的中文参数传递 过程模拟
为了帮助大家能更好地理解,我们使用下面的例子,该例通过联结的形式向Google服务器发送一个查询命令参数。
比如,我们通过Google查询“你好啊”,通过以下2种方法向Google服务器发送参数:
1. SubmitAsia2Google.html  
2. view plaincopy to clipboardprint?  
3. <html>      
4. <head>      
5. <meta http-equiv="content-type" content="text/html; charset=UTF-8">      
6. </head>      
7. <body>      
8. 方法1:<a href="http://www.google.com/search?q=你好啊">你好啊</a><br>      
9. 方法2:<a href="http://www.google.com/search?q=%E4%BD%A0%E5%A5%BD%E5%95%8A">你好啊</a>      
10. </body>      
11. </html>     
12. <html> 
13. <head> 
14. <meta http-equiv="content-type" content="text/html; charset=UTF-8"> 
15. </head> 
16. <body> 
17. 方法1:<a href="http://www.google.com/search?q=你好啊">你好啊</a><br> 
18. 方法2:<a href="http://www.google.com/search?q=%E4%BD%A0%E5%A5%BD%E5%95%8A">你好啊</a> 
19. </body> 
20. </html> 
使用任意浏览器打开该文件。
方法1:你好啊
方法2:你好啊
使用方法1时,Google的查询页面通常会显示乱码,方法2时显示完正常。
通过这个例子,我们知道,为了让服务器能够正常接收中文参数,对HTML页面的中文参数一定要经过编码处理。
表单里的中文字符在提交时,浏览器已经替我们做了编码处理,但联结(<a href.../>)里的中文需要我们自己处理。
JSP页面联结的中文参数编码方法
JSP页面里的联结很多情况下是动态生成的,比如根据数据库里的数据的不同动态生成包含中文关键字的联结等等。
方法1:JSP里直接使用java.net.URLEncoder.encode()。例:<a   href="some.jsp?key=<%=java.net.URLEncoder.encode("可能包含中文的参数","UTF-8")%>">联结</a> 
方法2:Javabean使用java.net.URLEncoder.encode()
在Javabean里使用java.net.URLEncoder.encode()处理之后,JSP里加以引用。
1. view plaincopy to clipboardprint?  
2. <jsp:useBean id="someBean" class="Beans.SomeBean"      
3.               scope="request" />      
4. ...        
5. <%      
6. String chars = myBean.getSomeProp();        
7. out.println("<a href=\"some.jsp?key=" + chars + ">联结</a>");      
8. %>      
9. ...     
10. <jsp:useBean id="someBean" class="Beans.SomeBean"   
11.               scope="request" /> 
12. ...  
13. <%  
14. String chars = myBean.getSomeProp();  
15. out.println("<a href=\"some.jsp?key=" + chars + ">联结</a>");  
16. %> 
17. ... 
方法3:使用自定义标签。
在自定义标签里使用java.net.URLEncoder.encode()方法处理。
关于自定义标签的具体方法,这里不做介绍。
JSP与SERVLET的连动
JSP经过上面的处理之后,后输出的HTML页面联结已经可以正常向服务器传递中文参数了。
下面我们阐述一下Servlet里怎么接收/解析中文参数。
对于<a href="/someServlet?key=%E4%BD%A0%E5%A5%BD">你好</a>之类的联结,我们可以用下面的servlet来解析传递过来的中文参数。
1. GetAsiaCharServlet.java  
2. view plaincopy to clipboardprint?  
3. import java.io.IOException;      
4. import java.net.URLEncoder;      
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. public class GetAsiaCharServlet extends HttpServlet {      
12.           
13.               
14.     @Override     
15.     //redir?key=xxxx      
16.     protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {      
17.          String key = req.getParameter("key");      
18.               
19.          key = <SPAN style="COLOR: #ff0000">new String(key.getBytes("ISO-8859-1", "utf-8"))</SPAN>;      
20.               
21.      System.out.println(keyword);      
22.     //...      
23.      
24.     //重定向处理      
25.     //res.sendRedirect("http://www.google.com/search?q="+URLEncoder.encode(key, "utf-8"));      
26.      }      
27. }     
28.  
29. import java.io.IOException;  
30. import java.net.URLEncoder;  
31.  
32. import javax.servlet.ServletException;  
33. import javax.servlet.http.HttpServlet;  
34. import javax.servlet.http.HttpServletRequest;  
35. import javax.servlet.http.HttpServletResponse;  
36.  
37. public class GetAsiaCharServlet extends HttpServlet {  
38.        
39.            
40.      @Override  
41.      //redir?key=xxxx 
42.      protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {  
43.          String key = req.getParameter("key");  
44.            
45.          key = new String(key.getBytes("ISO-8859-1", "utf-8"));  
46.            
47.      System.out.println(keyword);  
48.      //...  
49.  
50.      //重定向处理  
51.      //res.sendRedirect("http://www.google.com/search?q="+URLEncoder.encode(key, "utf-8"));  
52.      }  
53. } 
我们注意到使用req.getParameter("key")得到参数后,还使用了new String(key.getBytes("ISO-8859-1", "utf-8"))把ISO-8859-1字符集形式转换成UTF-8形式。
为什么呢?因为iso-8859-1是Java中网络传输使用的标准字符集,req.getParameter("key")得到的还是ISO-8859-1字符集,所以要转换一下才不会是乱码。
后,顺便提一下,采用servlet重定向时,也需要对包含中文文字的参数做特殊处理。
例如,SERVLET从HTML页面的联结接受参数,然后重新定向到Google搜索。则可以在上面的GetAsiaCharServlet里加上如下处理:res.sendRedirect("http://www.google.com/search?q="+URLEncoder.encode(key, "utf-8"));
也就是说,需要把参数取出来,转换,再重新使用URLEncoder.encode编码,这样就不会出现乱码现象。

本文标题:Java WEB开发中的中文乱码问题解决,责任编辑:武汉宏鹏,来源:北大青鸟武汉宏鹏鲁广校,于2013年08月15日10时40分发布于北大青鸟鲁广校区。武汉北大青鸟宏鹏鲁广校区,是北大青鸟武汉电脑学校,专业IT计算机培训,拥有软件/网络/安卓/Web前端/Java课程.北大青鸟地址:光谷广场鲁巷数码港.电话:027-87807717

专业老师指导

赵老师

从事IT教育培训十年有余,致力于帮助广大学子找到适合自己的专业。

培训咨询客服

刘老师

IT培训专业客服,用自己的真诚解决了无数学子的困惑。

本文地址:
文章标题:
  • 北大青鸟Java软件开发
  • 北大青鸟UI设计课程_零基础可学
  • 北大青鸟动漫设计_武汉设计学校
  • 北大青鸟数字艺术_武汉电脑学校
×
在线咨询更多问题

如您有任何疑问
在线咨询随时为您解答或拨打咨询热线:17740513250

×
  • 姓 名*
  • 手 机*
  • QQ号/微信号
  • 所报学科 *
  • 其他备注
  • 温馨提示:请保持手机畅通,咨询老师将为您提供专属的一对一报名服务。