JavaWEB开发中的中文乱码问题解决

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

创新互联专注于正蓝网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供正蓝营销型网站建设,正蓝网站制作、正蓝网页设计、正蓝网站官网定制、重庆小程序开发服务,打造正蓝网络公司原创品牌,更为您提供正蓝网站排名全网营销落地服务。

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

- Java语法

- Java WEB开发的基本概念

- Jsp

- Servlet

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

浏览器/WEB服务器之间的参数传递原理分析

浏览器/WEB服务器之间的中文参数传递

1,表单(form)中文参数的传递方法。我们使用一个简单的范例说明表单提交时浏览器的对中文参数的处理。

 
 
 
  1. SubmitAsia.html
  2. view plaincopy to clipboardprint?
  3.     
  4.     
  5.     
  6.   
  7.     
  8.     
  9.      
  10.     
  11.     
  12.    
  13.  

使用任意浏览器打开该文件,在输入框内输入 “你好” 中文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. import java.io.IOException;
  22. import java.io.UnsupportedEncodingException;
  23. import java.net.URLDecoder;
  24. import java.net.URLEncoder;
  25. public class EnDecoderUtil {
  26.      public static void main(String []args) {
  27.          try {
  28.              String str = URLEncoder.encode("你好", "UTF-8");
  29.              System.out.println(str);
  30.              str = URLDecoder.decode(str, "UTF-8");
  31.              System.out.println(str);
  32.          } catch (UnsupportedEncodingException e) {
  33.              e.printStackTrace();
  34.          }
  35.      }
  36. }

编译执行:

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.     
  4.     
  5.  http-equiv="content-type" content="text/html; charset=UTF-8">    
  6.     
  7.     
  8. 方法1: href="http://www.google.com/search?q=你好啊">你好啊
        
  9. 方法2: href="http://www.google.com/search?q=%E4%BD%A0%E5%A5%BD%E5%95%8A">你好啊    
  10.     
  11.    
  12.  http-equiv="content-type" content="text/html; charset=UTF-8">
  13. 方法1: href="http://www.google.com/search?q=你好啊">你好啊
  14. 方法2: href="http://www.google.com/search?q=%E4%BD%A0%E5%A5%BD%E5%95%8A">你好啊

使用任意浏览器打开该文件。

方法1:你好啊

方法2:你好啊

使用方法1时,Google的查询页面通常会显示乱码,方法2时显示完全正常。

通过这个例子,我们知道,为了让服务器能够正常接收中文参数,对HTML页面的中文参数一定要经过编码处理。
表单里的中文字符在提交时,浏览器已经替我们做了编码处理,但联结()里的中文需要我们自己处理。

JSP页面联结的中文参数编码方法

JSP页面里的联结很多情况下是动态生成的,比如根据数据库里的数据的不同动态生成包含中文关键字的联结等等。

方法1:JSP里直接使用java.net.URLEncoder.encode()。例:">联结

方法2:Javabean使用java.net.URLEncoder.encode()

在Javabean里使用java.net.URLEncoder.encode()处理之后,JSP里加以引用。

 
 
 
  1. view plaincopy to clipboardprint?
  2.  id="someBean" class="Beans.SomeBean"    
  3.               scope="request" />    
  4. ...      
  5. <%    
  6.     String chars = myBean.getSomeProp();      
  7.     out.println(" href=\"some.jsp?key=" + chars + ">联结");    
  8. %>    
  9. ...   
  10.  id="someBean" class="Beans.SomeBean" 
  11.               scope="request" />
  12. ...
  13. <%
  14.     String chars = myBean.getSomeProp();
  15.     out.println(" href=\"some.jsp?key=" + chars + ">联结");
  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 =  style="COLOR: #ff0000">new String(key.getBytes("ISO-8859-1", "utf-8"));    
  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. import java.io.IOException;
  29. import java.net.URLEncoder;
  30. import javax.servlet.ServletException;
  31. import javax.servlet.http.HttpServlet;
  32. import javax.servlet.http.HttpServletRequest;
  33. import javax.servlet.http.HttpServletResponse;
  34. public class GetAsiaCharServlet extends HttpServlet {
  35.      
  36.          
  37.      @Override
  38.      //redir?key=xxxx
  39.      protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
  40.          String key = req.getParameter("key");
  41.          
  42.          key = new String(key.getBytes("ISO-8859-1", "utf-8"));
  43.          
  44.      System.out.println(keyword);
  45.      //...
  46.      //重定向处理
  47.      //res.sendRedirect("http://www.google.com/search?q="+URLEncoder.encode(key, "utf-8"));
  48.      }
  49. }

我们注意到使用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编码,这样就不会出现乱码现象。

网页名称:JavaWEB开发中的中文乱码问题解决
分享链接:http://www.shufengxianlan.com/qtweb/news2/486252.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联