偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Java WEB開發(fā)中的中文亂碼問題解決

開發(fā) 后端
本文對(duì)Java JSP/SERVLET開發(fā)中的比較常見的中文參數(shù)亂碼 問題做一個(gè)透徹地分析,并試圖通過范例幫助大家能輕松理解,同時(shí)給出Java WEB中文參數(shù)亂碼解決的幾種方法。

本文所有范例以UTF-8為例。大家可以根據(jù)自己的情況加以替換。

在開始本文之前,假設(shè)本文的讀者已經(jīng)熟悉或了解以下技術(shù):

- Java語法

- Java WEB開發(fā)的基本概念

- Jsp

- Servlet

- 至少一種支持JSP/SERVLET的Web服務(wù)器(包括安裝,運(yùn)行)

瀏覽器/WEB服務(wù)器之間的參數(shù)傳遞原理分析

瀏覽器/WEB服務(wù)器之間的中文參數(shù)傳遞

1,表單(form)中文參數(shù)的傳遞方法。我們使用一個(gè)簡(jiǎn)單的范例說明表單提交時(shí)瀏覽器的對(duì)中文參數(shù)的處理。

  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> 

使用任意瀏覽器打開該文件,在輸入框內(nèi)輸入 “你好” 中文2字,然后按submit按鈕,我們注意到瀏覽器的地址欄:
file:///C:/SubmitAsia.html?userName=%E4%BD%A0%E5%A5%BD

剛才輸入“你好”二字,被轉(zhuǎn)換為 %E4%BD%A0%E5%A5%BD 后被發(fā)往服務(wù)器。

這個(gè) %E4%BD%A0%E5%A5%BD 是什么呢?

我們先使用一個(gè)Java程序來測(cè)試一下。如下:

  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.      }  


編譯執(zhí)行:

c:\>javac EnDecoderUtil.java

c:\>java EnDecoderUtil

%E4%BD%A0%E5%A5%BD

你好

我們發(fā)現(xiàn),瀏覽器發(fā)送給服務(wù)器的“你好”中文參數(shù)跟使用java.net.URLEncoder.encode()方法編碼后的值完全一樣。

原來,瀏覽器在向服務(wù)器傳遞參數(shù)時(shí),對(duì)于非數(shù)字,非英文的字符(比如中日韓文)時(shí),會(huì)先將其加以變換(編碼),再發(fā)送給服務(wù)器,服務(wù)器接收到這種格式的字符時(shí),會(huì)將其反向編碼,還原成原來的字符。

瀏覽器/Java WEB服務(wù)器之間的中文參數(shù)傳遞 過程模擬

為了幫助大家能更好地理解,我們使用下面的例子,該例通過聯(lián)結(jié)的形式向Google服務(wù)器發(fā)送一個(gè)查詢命令參數(shù)。
比如,我們通過Google查詢“你好啊”,通過以下2種方法向Google服務(wù)器發(fā)送參數(shù):

  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時(shí),Google的查詢頁面通常會(huì)顯示亂碼,方法2時(shí)顯示完全正常。

通過這個(gè)例子,我們知道,為了讓服務(wù)器能夠正常接收中文參數(shù),對(duì)HTML頁面的中文參數(shù)一定要經(jīng)過編碼處理。
表單里的中文字符在提交時(shí),瀏覽器已經(jīng)替我們做了編碼處理,但聯(lián)結(jié)(<a href.../>)里的中文需要我們自己處理。

JSP頁面聯(lián)結(jié)的中文參數(shù)編碼方法

JSP頁面里的聯(lián)結(jié)很多情況下是動(dòng)態(tài)生成的,比如根據(jù)數(shù)據(jù)庫(kù)里的數(shù)據(jù)的不同動(dòng)態(tài)生成包含中文關(guān)鍵字的聯(lián)結(jié)等等。

方法1:JSP里直接使用java.net.URLEncoder.encode()。例:<a   href="some.jsp?key=<%=java.net.URLEncoder.encode("可能包含中文的參數(shù)","UTF-8")%>">聯(lián)結(jié)</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 + ">聯(lián)結(jié)</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 + ">聯(lián)結(jié)</a>");  
  16. %> 
  17. ... 

方法3:使用自定義標(biāo)簽。

在自定義標(biāo)簽里使用java.net.URLEncoder.encode()方法處理。

關(guān)于自定義標(biāo)簽的具體方法,這里不做介紹。

JSP與SERVLET的連動(dòng)

JSP經(jīng)過上面的處理之后,***輸出的HTML頁面聯(lián)結(jié)已經(jīng)可以正常向服務(wù)器傳遞中文參數(shù)了。

下面我們闡述一下Servlet里怎么接收/解析中文參數(shù)。

對(duì)于<a href="/someServlet?key=%E4%BD%A0%E5%A5%BD">你好</a>之類的聯(lián)結(jié),我們可以用下面的servlet來解析傳遞過來的中文參數(shù)。

  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.      }  

我們注意到使用req.getParameter("key")得到參數(shù)后,還使用了new String(key.getBytes("ISO-8859-1", "utf-8"))把ISO-8859-1字符集形式轉(zhuǎn)換成UTF-8形式。

為什么呢?因?yàn)閕so-8859-1是Java中網(wǎng)絡(luò)傳輸使用的標(biāo)準(zhǔn)字符集,req.getParameter("key")得到的還是ISO-8859-1字符集,所以要轉(zhuǎn)換一下才不會(huì)是亂碼。

***,順便提一下,采用servlet重定向時(shí),也需要對(duì)包含中文文字的參數(shù)做特殊處理。

例如,SERVLET從HTML頁面的聯(lián)結(jié)接受參數(shù),然后重新定向到Google搜索。則可以在上面的GetAsiaCharServlet里加上如下處理:res.sendRedirect("http://www.google.com/search?q="+URLEncoder.encode(key, "utf-8"));

也就是說,需要把參數(shù)取出來,轉(zhuǎn)換,再重新使用URLEncoder.encode編碼,這樣就不會(huì)出現(xiàn)亂碼現(xiàn)象。

【編輯推薦】

  1. 淺談Java SE、Java EE、Java ME三者的區(qū)別
  2. Java虛擬機(jī)內(nèi)部構(gòu)成淺析
  3. 淺談Java編程語言中創(chuàng)建和使用日期
  4. 詳解Java的特點(diǎn)與優(yōu)勢(shì)
  5. 淺談為什么Java接口中不允許定義變量
責(zé)任編輯:彭凡 來源: blogjava
相關(guān)推薦

2011-06-13 16:16:32

Qt 中文問題

2009-06-30 14:02:00

Struts亂碼Eclipse

2011-06-14 13:41:27

muleWSDL

2011-08-19 14:03:34

IOS開發(fā)NSDATANSSTRING

2009-06-09 15:51:07

Java ee中文問題解決方法

2009-07-17 14:33:05

Jython中文問題

2017-02-27 17:06:43

Java Web開發(fā)亂碼

2011-02-23 13:48:05

Web

2009-02-18 14:28:23

編碼亂碼JSP

2011-03-18 18:47:34

QtMySQL

2009-08-14 13:49:58

Rails中文問題

2013-06-14 10:48:53

IIS 7

2011-04-25 13:06:38

EclipseLinux

2010-05-05 14:20:46

AIX CDE

2011-09-07 17:41:01

ubunturvm

2009-06-03 15:50:51

eclipse中啟動(dòng)超eclipsetomcat

2010-04-28 18:01:15

Unix系統(tǒng)

2010-06-17 11:35:24

Ubuntu 修復(fù)Gr

2011-06-27 16:44:59

Qmake

2009-11-30 13:04:38

PHP獲取Oracle
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)