get-post-頁面亂碼分析和解決

1、Get方式的中文亂碼
1) 使用以下頁面表單內容:
[HTML] 純文本查看 複製代碼
?html

<form action="http://127.0.0.1:8080/day07/params" method="get">瀏覽器

用戶名:<input name="username" type="text" /><br/>

    密 碼:<input name="password" type="password" /><br/>

    <input type="submit" />

</form>
2) 獲取表單內容代碼:
圖1 tomcat

3) 控制檯打印亂碼內容:
圖2 服務器

4) 亂碼的根本緣由是什麼呢?
(打開tomcat下doc工程/index.html文件——Configuration—-HTTP 搜索 URIEncoding)
圖3 post

解決亂碼的核心代碼:
解決亂碼的核心思路,就是把獲得的亂碼按照原來亂碼的步驟逆序操做。
一、先以iso-8895-1進行解碼
二、而後再以utf-8進行編碼
1) 第一種方式 使用URLEncoder 和 URLDecoder 兩個類 編解碼
如:
[Java] 純文本查看 複製代碼
?this

//獲取客戶端傳遞過來的用戶名參數值編碼

String username = request.getParameter("username");

System.out.println("用戶名:" + username);



// 先對用戶名進行解碼獲得%E7%8E%8B%E6%8C%AF%E5%9B%BD 這樣的形式

username = URLEncoder.encode(username, "ISO-8859-1");



// 再進行utf-8編碼 一次獲得頁面上輸入的文本內容

username = URLDecoder.decode(username, "UTF-8");

System.out.println("亂碼解決後用戶名:" + username);
2) 第二種方式 使用 String類的方法進行編解碼code

[Java] 純文本查看 複製代碼
?orm

username = new String(username.getBytes("ISO-8859-1"), "UTF-8");[/align]htm

System.out.println("亂碼解決後用戶名:" + username);

解決亂碼的代碼以下:

public class Params2 extends HttpServlet {

private static final long serialVersionUID = 1L;

protected void doGet(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException {



//獲取客戶端傳遞過來的用戶名參數值

String username = request.getParameter("username");

System.out.println("用戶名:" + username);

// 先對用戶名進行編碼獲得%E7%8E%8B%E6%8C%AF%E5%9B%BD 這樣的形式

//  username = URLEncoder.encode(username, "ISO-8859-1");

//再進行utf-8解碼 一次獲得頁面上輸入的文本內容

//  username = URLDecoder.decode(username, "UTF-8");

// System.out.println("亂碼解決後用戶名:" + username);

// 先iso-8859-1編碼,再utf-8解碼       

username = new String(username.getBytes("ISO-8859-1"), "UTF-8");



System.out.println("亂碼解決後用戶名:" + username);



// 獲取密碼

String password = request.getParameter("password");

System.out.println("密碼:" + password);

}

}
2、POST請求中文參數值亂碼問題解決
post請求方式亂碼的緣由是:
由於post是以二進制流的形式發送到的服務器。服務器收到數據後。
默認以iso-8859-1進行編碼。
POST請求亂碼解決,只須要在獲取請求參數以前調用
request.setCharacterEncoding(「UTF-8」); 方法設置字符集 便可。
以下:
[Java] 純文本查看 複製代碼
?

protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {

// 1.post請求方式的數據是以二進制流的形式發送到服務器。

// 2.那麼就說明它缺乏一個字符集。因此咱們要設置請求體的字符集便可。

// setCharacterEncoding必需要獲取請求參數以前調用纔有效

request.setCharacterEncoding("UTF-8");



//獲取客戶端傳遞過來的用戶名參數值

String username = request.getParameter("username");

System.out.println("用戶名:" + username);

}
3、輸出中文到客戶端的亂碼解決方法
(1)、輸出字符串內容到客戶端
1) 往客戶端輸出。分兩個步驟:
第一步:先獲取輸出流(二進制返回用獲取字節流,字符出獲取字符流)
第二步:調用輸出流對象,寫出數據第客戶端
如:

[Java] 純文本查看 複製代碼
?
01
02
03
04
05
06
07
08
09
10
11
12
protected void doGet(HttpServletRequest request,[/align]

HttpServletResponse response) throws ServletException, IOException {

// 經過response響應對象獲取到字符輸出流

Writer writer = response.getWriter();

// 往 客戶 端 輸出數據。

writer.write("this is response content!");

}
可是:輸出中文到客戶端的亂碼解決方法
1) 若是拿到writer字符輸出流。直接輸出中文內容返回到客戶端。會獲得亂碼。
好比:
程序以下,客戶端收到會有亂碼狀況:

[Java] 純文本查看 複製代碼
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
protected void doGet(HttpServletRequest request,[/align]

HttpServletResponse response) throws ServletException, IOException {

// 經過response響應對象獲取到字符輸出流

Writer writer = response.getWriter();

// 往 客戶 端 輸出數據。

// writer.write("this is response content!");

// 輸出中文數據到客戶端

 writer.write("這是中文的輸出");

}
經過瀏覽器訪問後顯示的結果:
圖4

遇到這種狀況是什麼緣由呢?
主要是由於服務器輸出的字符串的編碼和客戶端顯示字符串的編碼不一致。致使亂碼問題。
因此咱們只須要設置服務器和客戶端的編碼相同就能夠解決這個問題。
2) 亂碼的解決。
[Java] 純文本查看 複製代碼
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
設置服務器的字符串編碼

//設置服務器輸出的編碼爲UTF-8

response.setCharacterEncoding("UTF-8");

設置客戶端的字符串顯示編碼。

//告訴瀏覽器輸出的內容是html,而且以utf-8的編碼來查看這個內容。

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

這兩行語句要在獲取輸出流以前執行。纔會生效。

protected void doGet(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException {



//設置服務器輸出的編碼爲UTF-8

response.setCharacterEncoding("UTF-8");



//告訴瀏覽器輸出的內容是html,而且以utf-8的編碼來查看這個內容。

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



// 經過response響應對象獲取到字符輸出流

Writer writer = response.getWriter();

// 往 客戶 端 輸出數據。

// writer.write("this is response content!");



// 輸出中文數據到客戶端

 writer.write("這是中文的輸出");

}再次經過瀏覽器訪問。獲得的是正確的中文。 圖5:

相關文章
相關標籤/搜索