中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2021-07-13 18:39:08 來源:億速云 閱讀:234 作者:chen 欄目:編程語言

本篇內容介紹了“Java WEB開發中的中文亂碼問題如何解決”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

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

在開始本文之前,假設本文的讀者已經熟悉或了解以下技術:

- Java語法

- Java WEB開發的基本概念

- Jsp

- Servlet

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

瀏覽器/WEB服務器之間的參數傳遞原理分析

瀏覽器/WEB服務器之間的中文參數傳遞

1,表單(form)中文參數的傳遞方法。我們使用一個簡單的范例說明表單提交時瀏覽器的對中文參數的處理。

SubmitAsia.html  view plaincopy to clipboardprint?  <html>      <head>      <meta http-equiv="content-type" content="text/html; charset=UTF-8">      </head>    <body>      <form method="get">      <input type="text" name="userName" id="userName"> <input type="submit" value="submit" />      </form>      </body>      </html>     <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> </head> <body> <form method="get"> <input type="text" name="userName" id="userName"> <input type="submit" value="submit" /> </form> </body> </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程序來測試一下。如下:

EnDecoderUtil.java  view plaincopy to clipboardprint?  import java.io.IOException;      import java.io.UnsupportedEncodingException;      import java.net.URLDecoder;      import java.net.URLEncoder;           public class EnDecoderUtil {          public static void main(String []args) {              try {                   String str = URLEncoder.encode("你好", "UTF-8");                   System.out.println(str);                   str = URLDecoder.decode(str, "UTF-8");                   System.out.println(str);                    } catch (UnsupportedEncodingException e) {                   e.printStackTrace();               }           }      }      import java.io.IOException;  import java.io.UnsupportedEncodingException;  import java.net.URLDecoder;  import java.net.URLEncoder;   public class EnDecoderUtil {       public static void main(String []args) {           try {               String str = URLEncoder.encode("你好", "UTF-8");               System.out.println(str);               str = URLDecoder.decode(str, "UTF-8");               System.out.println(str);            } catch (UnsupportedEncodingException e) {               e.printStackTrace();           }       }  }


編譯執行:

c:\>javac EnDecoderUtil.java

c:\>java EnDecoderUtil

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

你好

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

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

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

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

SubmitAsia2Google.html  view plaincopy to clipboardprint?  <html>      <head>      <meta http-equiv="content-type" content="text/html; charset=UTF-8">      </head>      <body>      方法1:<a href="http://www.google.com/search?q=你好啊">你好啊</a><br>      方法2:<a href="http://www.google.com/search?q=%E4%BD%A0%E5%A5%BD%E5%95%8A">你好啊</a>      </body>      </html>     <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> </head> <body> 方法1:<a href="http://www.google.com/search?q=你好啊">你好啊</a><br> 方法2:<a href="http://www.google.com/search?q=%E4%BD%A0%E5%A5%BD%E5%95%8A">你好啊</a> </body> </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里加以引用。

view plaincopy to clipboardprint?  <jsp:useBean id="someBean" class="Beans.SomeBean"                    scope="request" />      ...        <%      String chars = myBean.getSomeProp();        out.println("<a href=\"some.jsp?key=" + chars + ">聯結</a>");      %>      ...     <jsp:useBean id="someBean" class="Beans.SomeBean"                 scope="request" /> ...  <%  String chars = myBean.getSomeProp();  out.println("<a href=\"some.jsp?key=" + chars + ">聯結</a>");  %> ...

方法3:使用自定義標簽。

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

關于自定義標簽的具體方法,這里不做介紹。

JSP與SERVLET的連動

JSP經過上面的處理之后,***輸出的HTML頁面聯結已經可以正常向服務器傳遞中文參數了。

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

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

GetAsiaCharServlet.java  view plaincopy to clipboardprint?  import java.io.IOException;      import java.net.URLEncoder;           import javax.servlet.ServletException;      import javax.servlet.http.HttpServlet;      import javax.servlet.http.HttpServletRequest;      import javax.servlet.http.HttpServletResponse;           public class GetAsiaCharServlet extends HttpServlet {                                  @Override         //redir?key=xxxx          protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {               String key = req.getParameter("key");                             key = <SPAN style="COLOR: #ff0000">new String(key.getBytes("ISO-8859-1", "utf-8"))</SPAN>;                         System.out.println(keyword);          //...               //重定向處理          //res.sendRedirect("http://www.google.com/search?q="+URLEncoder.encode(key, "utf-8"));           }      }      import java.io.IOException;  import java.net.URLEncoder;   import javax.servlet.ServletException;  import javax.servlet.http.HttpServlet;  import javax.servlet.http.HttpServletRequest;  import javax.servlet.http.HttpServletResponse;   public class GetAsiaCharServlet extends HttpServlet {                         @Override       //redir?key=xxxx      protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {           String key = req.getParameter("key");                      key = new String(key.getBytes("ISO-8859-1", "utf-8"));                  System.out.println(keyword);       //...        //重定向處理       //res.sendRedirect("http://www.google.com/search?q="+URLEncoder.encode(key, "utf-8"));       }  }

我們注意到使用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編碼,這樣就不會出現亂碼現象。

“Java WEB開發中的中文亂碼問題如何解決”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

吉安市| 沿河| 健康| 额济纳旗| 迭部县| 石棉县| 讷河市| 塘沽区| 错那县| 富锦市| 灵武市| 五莲县| 都兰县| 林甸县| 沈丘县| 兴义市| 文水县| 乐平市| 东兰县| 开江县| 正安县| 广元市| 筠连县| 石屏县| 石阡县| 日照市| 辽中县| 东台市| 观塘区| 普兰县| 瑞金市| 平谷区| 吉隆县| 东光县| 定结县| 抚远县| 革吉县| 南康市| 萨嘎县| 津南区| 普兰店市|