Java WEB开发中出现乱码怎么办?这里拯救你..

   在JAVA WEB开发过程中出现乱码怎么办,该怎么办,怎么处理?本文所有范例以UTF-8为例为大家解决这个问题,大家可以依据自己实际情况加以替换。

  在开始本文之前,假设你已经熟悉或了解以下技术:

  - Java语法

  - Java WEB开发的基本概念

  - Jsp

  - Servlet

  至少一种支持JSP/SERVLETWeb服务器(包括安装,运行)

  浏览器/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页面里的联结很多情况下是动态生成的,比如根据数据库里的数据的不同动态生成包含中文关键字的联结等等。

  方法1JSP里直接使用java.net.URLEncoder.encode()。例:<a href="some.jsp?key=<%=java.net.URLEncoder.encode("可能包含中文的参数","UTF-8")%>">联结</a>

  方法2Javabean使用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()方法处理。

  关于自定义标签的具体方法,这里不做介绍。

  JSPSERVLET的连动

  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-1Java中网络传输使用的标准字符集,req.getParameter("key")得到的还是ISO-8859-1字符集,所以要转换一下才不会是乱码。

  最后,顺便提一下,采用servlet重定向时,也需要对包含中文文字的参数做特殊处理。

  例如,SERVLETHTML页面的联结接受参数,然后重新定向到Google搜索。则可以在上面的GetAsiaCharServlet里加上如下处理:res.sendRedirect("http://www.google.com/search?q="+URLEncoder.encode(key, "utf-8"));也就是说,需要把参数取出来,转换,再重新使用URLEncoder.encode编码,这样就不会出现乱码现象。

 

如需了解更多,或者需要沟通JAVA方面的知识请加群457036818

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值