servlet 中字符集的處理

Servlet運行的步驟html

Servlet做爲Web服務器的補充功能在運行時須要受到Servlet容器的管理,其運行的流程以下:java

  1. 瀏覽器依據IP創建與容器的鏈接
  2. 瀏覽器將請求數據打包
  3. 容器解析請求數據包,封裝request和response對象
  4. 容器依據請求資源路徑找到Servlet建立對象
  5. 容器將request和response對象做爲參數傳入service方法,並調用
  6. 容器將響應數據打包發給瀏覽器
  7. 瀏覽器取出結果,生成頁面

解決輸出內容的亂碼問題數組

在service()方法中第一行的位置上添加以下代碼瀏覽器

response.setContentType("text/html;charset=utf-8")服務器

其中charset可使用其餘支持中文的字符集,如GBK。setContentType()有兩個做用:post

  1. 通知容器,在調用out.println方法輸出時,使用指定的字符集
  2. 生成一個消息頭(content-type),通知瀏覽器,服務器返回的數據類型和字符集

使用該段代碼修改默認的編碼方式時,必定要保證在調用print以前編寫,因此該段代碼儘可能放在service方法的第一行的位置。在charset以前使用的是分號隔開,若是寫錯,則會出現保存文件的界面,緣由是瀏覽器不能識別消息頭的值,因而讓用戶來處理ui

 1 package com.yunhua.servlet;
 2 
 3 import java.io.IOException;
 4 import java.io.PrintWriter;
 5 
 6 import javax.servlet.http.HttpServlet;
 7 import javax.servlet.http.HttpServletRequest;
 8 import javax.servlet.http.HttpServletResponse;
 9 
10 public class ServletTest extends HttpServlet {
11     public void service(HttpServletRequest request, HttpServletResponse response) {
12         response.setContentType("text/html;charset=utf-8");//放在第一行
13         PrintWriter out = null;
14         try {
15             out = response.getWriter();
16         } catch (IOException e) {
17             // TODO Auto-generated catch block
18             e.printStackTrace();
19         } finally {
20             out.print("中文");
21             out.close();
22         }
23     }
24 }

爲何表單提交中文會出現亂碼編碼

    當表單提交時,瀏覽器會對錶單中的中文參數值進行編碼,而使用的編碼是打開頁面時所使用的字符集,如當前頁面使用的UTF-8的字符集進行顯示的,那麼表單提交的數據就會以UTF-8的方式進行編碼後傳輸,而Web服務器在默認狀況下對提交的表單數據會使用ISO-8859-1的字符集來解碼,編碼與解碼的方式不一致就產生了表單提交時的中文亂碼問題。spa

如何解決表單提交時的中文亂碼問題code

步驟1、確保表單所在的頁面按照指定的字符集打開

在HTML頁面中使用meta標記能夠確保瀏覽器按照指定的字符集進行解碼頁面,並限定表單提交時的數據編碼方式

1 <meta http-equiv="content-type" content="text/html;charset=utf-8">


在服務器端須要在調用getParameter方法讀取參數以前,告訴瀏覽器如何解碼,使用以下代碼便可完成該設置:

1 request.setCharacterEncoding("utf-8");

注意該方法必定要要放在全部request.getParameter方法以前。

這種方式只針對POST請求有效。

 

解決GET方式提交時的中文亂碼問題

步驟1、確保表單所在的頁面按照指定的字符集打開

在HTML頁面中使用meta標記能夠確保瀏覽器按照指定的字符集進行解碼頁面,並限定表單提交時的數據編碼方式

<meta http-equiv="content-type" content="text/html;charset=utf-8">

步驟2、完成ISO-8859-1到UTF-8格式的轉換

1 String username = request.getParameter(「username」);
2 username = new String(username.getBytes(「iso-8859-1」),「UTF-8」);

  因爲GET方式提交的任何數據在服務器端必定會以ISO-8859-1的方式進行解碼,因此服務器端能夠先按ISO-8859-1的方式獲取字節數組,在將該數組轉變成UTF-8對應的字符串形式。

 1 package com.yunhua.servlet;
 2 
 3 import java.io.IOException;
 4 import java.io.PrintWriter;
 5 
 6 import javax.servlet.http.HttpServlet;
 7 import javax.servlet.http.HttpServletRequest;
 8 import javax.servlet.http.HttpServletResponse;
 9 
10 public class ServletTest extends HttpServlet {
11     public void service(HttpServletRequest request, HttpServletResponse response) {
12         response.setContentType("text/html;charset=utf-8");//放在第一行
13         PrintWriter out = null;
14         try {
15             request.setCharacterEncoding("UTF-8");         //放在前面攔截post請求的數據
16             //將iso-8859-1裝換成指定字符集
17             String param = new String(request.getParameter("").getBytes("iso-8859-1"), "UTF-8");
18             out = response.getWriter();
19         } catch (IOException e) {
20             // TODO Auto-generated catch block
21             e.printStackTrace();
22         } finally {
23             out.print("中文");
24             out.close();
25         }
26     }
27 }
相關文章
相關標籤/搜索