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;
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:你好啊
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:你好啊
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里怎么接收/解析中文参数。
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编码,这样就不会出现乱码现象。