<address id="tl39t"><listing id="tl39t"><meter id="tl39t"></meter></listing></address>
<form id="tl39t"></form>
<address id="tl39t"></address><form id="tl39t"></form><address id="tl39t"></address>
<form id="tl39t"></form>

      <em id="tl39t"></em>
      <listing id="tl39t"><listing id="tl39t"><meter id="tl39t"></meter></listing></listing>

        歡迎訪問北大青鳥魯廣校區~

      1. 加入收藏
      2. 設為主頁
      3. 學校簡介
      北大青鳥魯廣校區

      17740513250

      三分鐘了解北大青鳥

      ×
      • 數據加載中...

      Java WEB開發中的中文亂碼問題解決

      責任編輯:宏鵬來源:武漢北大青鳥魯廣校區發布時間:2023-01-06 15:47:37
      導讀:本文旨在探討解決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>

      使用任意瀏覽器打開該文件,在輸入框內輸入 &ldquo;你好&rdquo; 中文2字,然后按submit按鈕,我們注意到瀏覽器的地址欄:

      file:///C:/SubmitAsia.html?userName=%E4%BD%A0%E5%A5%BD

      剛才輸入&ldquo;你好&rdquo;二字,被轉換為 %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

      你好

      我們發現,瀏覽器發送給服務器的&ldquo;你好&rdquo;中文參數跟使用java.net.URLEncoder.encode()方法編碼后的值完一樣。

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

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

      為了幫助大家能更好地理解,我們使用下面的例子,該例通過聯結的形式向Google服務器發送一個查詢命令參數。

      比如,我們通過Google查詢&ldquo;你好啊&rdquo;,通過以下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="//www.google.com/search?q=你好啊">你好啊</a><br>

      9.方法2:<a href="//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="//www.google.com/search?q=你好啊">你好啊</a><br>

      18.方法2:<a href="//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("//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("//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("//www.google.com/search?q="+URLEncoder.encode(key, "utf-8"));

      也就是說,需要把參數取出來,轉換,再重新使用URLEncoder.encode編碼,這樣就不會出現亂碼現象。

      本文標題:#Java WEB開發中的中文亂碼問題解決#,宏鵬發布于北大青鳥魯廣校區。本文旨在探討解決Java WEB開發中的中文亂碼問題。

      專業老師指導

      專業老師指導

      趙老師

      從事IT教育培訓十年有余,致力于幫助廣大學子找到適合自己的專業。

      培訓咨詢客服

      培訓咨詢客服

      陳老師

      IT培訓專業客服,用自己的真誠解決了無數學子的困惑。

      本文地址:http://www.nintendodownloader.com/wenda/java/2822.html

      大家都在看的大家都在看的Java開發

      熱門課程

      更多>>
      • 數據加載中...
      7天免費試學

      7天課程免費試學

      實戰學習干貨限時領取

      行業解讀+大咖授課+項目實操
      10年以上業內強師集結,手把手帶你蛻變精英!

      點我咨詢
      ×
      在線咨詢更多問題

      如您有任何疑問
      在線咨詢隨時為您解答或撥打咨詢熱線:13125006136

      ×
      • 姓 名*
      • 手 機*
      • QQ號/微信號
      • 所報學科 *
      • 其他備注
      • 驗證碼 獲取驗證碼 *
      • 溫馨提示:請保持手機暢通,咨詢老師將為您提供專屬的一對一報名服務。