Jsp頁面中的字元編碼方式與亂碼解決方法

2021-07-24 23:53:37 字數 3178 閱讀 8392

3、request.setcharacterencoding("utf-8")的作用是設定對客戶端請求進行編碼的方式 。

該方法用來指定對瀏覽器傳送來的資料進行編碼的編碼方式。

4、response.setcharacterencoding("utf-8")的作用是指定伺服器響應的編碼方式 。

伺服器在將資料傳送到瀏覽器前,對資料進行重新編碼時,使用的就是該編碼。

瀏覽器接收與傳送資料的編碼方式

其次,要說一說瀏覽器是怎麼樣對接收和傳送的資料進行編碼的

response.setcharacterencoding("utf-8")的作用是指定對伺服器響應進行編碼的編碼方式。同時,瀏覽器也是根據這個引數來對其接收到的資料進行編碼。

所以在無論你在jsp中設定response.setcharacterencoding("utf-8")或者response.setcharacterencoding("gbk"),瀏覽器均能正確顯示中文(前提是你傳送到瀏覽器的資料編碼是正確的,比如正確設定了pageencoding引數等)。

下面做個測試,在jsp中設定response.setcharacterencoding("utf-8"),在ie中顯示該頁面時,在ie的選單中選擇「檢視(v)-->編碼(d)」中可以檢視到是「unicode(utf-8)」,而在在jsp中設定response.setcharacterencoding("gbk"),在ie中顯示該頁面時,在ie的選單中選擇「檢視(v)-->編碼(d)」中可以檢視到是「簡體中文(gb2312)」。

瀏覽器在傳送資料時,對url和引數會進行url編碼,對引數中的中文,瀏覽器也是使用response.setcharacterencoding引數來進行url編碼的。以baidu和google為例,如果你在baidu中搜尋「漢字」,百度會將其編碼為「%ba%ba%d7%d6」(百度主頁面表單是以get方式請求的,提交時瀏覽器會自動對搜尋框中的值採用頁面編碼,然後把編碼轉換成%xx形式串,並放在http請求頭中傳送到伺服器,編碼轉換後內容還會顯示在位址列中)。

而在google中搜尋「漢字」,google會將其編碼為「%e6%b1%89%e5%ad%97」(以前可以,現在好像直接顯示了),這是因為baidu的response.setcharacterencoding引數為gbk,而google的response.setcharacterencoding引數為utf-8。

瀏覽器在接收伺服器資料和傳送資料到伺服器時所使用的編碼是相同的,預設情況下均為jsp頁面的response.setcharacterencoding引數(或者contenttype和pageencoding引數),我們稱其為瀏覽器編碼。 當然,在ie中可以修改瀏覽器編碼(在ie的選單中選擇「檢視(v)-->編碼(d)」中修改),但通常情況下,修改該引數會使原本正確的頁面中出現亂碼。

乙個有趣的例子是,在ie中瀏覽goole的主頁時,將瀏覽器編碼修改為「簡體中文(gb2312)」,此時,頁面上的中文會變成亂碼,不理它,在文字框中輸入「漢字」,提交,google會將其編碼為「%ba%ba%d7%d6」,可見,瀏覽器在發往伺服器前,對引數內容進行url編碼時,使用的就是瀏覽器編碼 。

伺服器接收與傳送資料的編碼方式

我們再來看看伺服器是在接收和傳送資料時,是如何對資料進行編碼的。

對於傳送資料,伺服器按照response.setcharacterencoding-->contenttype-->pageencoding的優先順序,對要傳送的資料進行編碼 。

對於接收資料,要分三種情況。一種是瀏覽器直接用url提交的資料,另外兩種是用表單的get和post方式提交的資料。

因為各種web伺服器對這三種方式的處理也不相同,所以我們以tomcat5.0為例。

無論使用那種方式提交,如果引數中包含中文,瀏覽器都會使用當前瀏覽器編碼對其進行url編碼。

對於表單中post方式提交的資料,只要在接收資料的jsp中正確request.setcharacterencoding引數,即將對客戶端請求進行的編碼設定成瀏覽器編碼,就可以保證得到的引數編碼正確。那如何得到瀏覽器編碼呢?

上面我們提過了,在預設請情況下,瀏覽器編碼就是你在響應該請求的jsp頁面中response.setcharacterencoding設定的值。所以對於post表單提交的資料,在獲得資料的jsp頁面中request.

setcharacterencoding要和生成提交該表單的jsp頁面的response.setcharacterencoding設定成相同的值即可。

對於url提交的資料和表單中get方式提交的資料,在接收資料的jsp中設定request.setcharacterencoding引數是不行的,因為在tomcat5.0中,預設情況下使用iso-8859-1對url提交的資料和表單中get方式提交的資料進行編碼,而不使用該引數對url提交的資料和表單中get方式提交的資料進行重新編碼。

要解決該問題,,其中usebodyencodingforuri 引數表示是否用request.,在預設情況下,該引數為false(tomcat4.0中該引數預設為true);uriencoding 引數指定對所有get方式請求(包括url提交的資料和表單中get方式提交的資料)進行統一編碼的方式。

uriencoding和usebodyencodingforuri區別是,uriencoding是對所有get方式的請求的資料進行統一的編碼,會影響所有的web應用,而usebodyencodingforuri則是根據響應該請求的頁面的request.setcharacterencoding引數對資料進行的重新編碼,不同的頁面可以有不同的編碼方式。所以對於url提交的資料和表單中get方式提交的資料,,並且在獲得資料的jsp頁面或servlet中request.

setcharacterencoding引數設定成瀏覽器編碼後,再獲取引數值 。

總結以tomcat5.0為web伺服器時,如何防止中文亂碼。

1、對於同乙個應用,最好統一編碼,推薦為utf-8,當然gbk也可以。

2、正確設定jsp的pageencoding引數

3、在所有的jsp/servlet中設定contenttype="text/html;charset=utf-8"或response.setcharacterencoding("utf-8"),從而間接實現對瀏覽器編碼的設定。

4、對於請求,可以使用過濾器或者在每個jsp/servlet中設定request.setcharacterencoding("utf-8")。同時,要修改tomcat的預設配置,推薦將usebodyencodingforuri引數設定為true,也可以將uriencoding引數設定為utf-8(有可能影響其他應用,所以不推薦)

QS認證中食品的分類與編碼規則

具體類別編號規定 糧食加工品 小麥粉0101 大公尺0102 掛麵0103 其他糧食加工品0104 食用油 油脂及其製品 食用植物油0201 食用油脂製品0202 食用動物油脂0203 調味品 醬油0301 食醋0302 味精0304 雞精調味料0305 醬類0306 其他調味品0307 肉製品 肉...

供電系統中交流與直流傳輸方式的利弊分析

為了能夠解決這個公升壓和降壓的問題,人們很自然地想到了採用交流電,因為這樣才可以用變壓器來達到公升降壓的目的。而實際的各種嘗試也的確證明了這種想法的可行性。所以後來出生在奧匈帝國克羅埃西亞的尼古拉 蒂斯拉的技術原理在喬治 威斯汀豪斯的支援下,終於將交流電引向實際應用。而此時,固執的愛迪生的直流電傳輸...

液壓站結構設計中的方式分析與方案選擇

摘要 在液壓伺服系統中,液壓站是整個傳動系統的動力源,是為傳動提供動力的基本結構。液壓站工作原理為電機帶動油幫浦工作提供壓力源,通過整合塊 液壓閥等對驅動裝置 油缸或馬達 進行方向 壓力 流量的調節和控制,實現各種規定動作。本文介紹了液壓站的總體布置 元件連線 動力源裝置的方案選擇。關鍵詞 液壓站結...