亂碼原因:
1、瀏覽器頁面資料傳遞到伺服器時亂碼,示意為:
頁面(字元)------->自動轉換為位元組------->伺服器(將位元組轉化成字元,否則亂碼)
2、伺服器傳遞資料到頁面時亂碼,示意為:
伺服器(字元,需要設定返回資料的中文編碼,否則亂碼)------->自動轉換為位元組------->頁面(將位元組按照頁面指定的編碼格式轉化成字元)
詳解如下:
1、瀏覽器頁面資料傳遞到伺服器時亂碼
瀏覽器頁面解讀頁面的編碼格式可以在頁面的頭資訊中指定,頁面上的輸入的字元則也是按照指定的編碼格式儲存,傳遞引數的時候會將字元轉化成位元組,在後台就收引數的時候需要將接收到的位元組轉化成字元才能操作,但是轉化是預設按照iso-8859-1的編碼方式轉化的,故會出現亂碼問題.
get請求方式解決:
1、 string username=new string(request.getparameter("username").getbytes("iso-8859-1 "),"utf-8");
說明:此方法表示在接受引數後重新對引數編碼,故對於get方式要手動對引數逐個解碼,此過程可以在過濾器中來對引數編碼
2、修改tomcat的配置,加上uriencoding="utf-8" :
注:這種方式缺點顯而易見,換了伺服器就要更改,有時候忘記也是很常見的事情,同時這個設定更改了tomcat下所有應用的編碼格式嗎,不夠靈活
post請求方式解決:
1、request.setcharacterencoding(「utf-8」)
說明:此方法是在接收引數前指定接收資料的編碼格式。
注意:該方法只對post請求中的實體內容有效,對get請求無效,並且轉碼的話前提是頁面指定的編碼格式也要是utf-8,轉碼是按照頁面指定的編碼格式轉換
2、伺服器傳遞資料到頁面時亂碼
在伺服器向瀏覽器傳送資料時會將字元轉化成位元組流輸送,但是預設的轉化方式還是iso-8859-1,故要指定返回資料的編碼格式。
1、設定響應返回資料格式為:reponse.setcharacterencoding(「utf-8」);reponse.setcontenttype("text/html"),合併寫為:response.setcontenttype(「text/html」 ;charset=utf-8)
注:此方法針對字元流返回資料,因為字元流會按照指定的編碼格式查詢碼表編碼,但是此方法對於位元組流無效,因為位元組流不會去查編碼表,返回的資料中如果有中文的話則中文的編碼格式就是中文字元預設的編碼gbk,可以通過如「hello」.getbytes(「utf-8」)指定位元組流的編碼格式;
瀏覽器接收到資料後按照瀏覽器頁面設定的編碼格式來解碼,頁面設定的編碼格式和後台接受轉碼的編碼格式都要一致才行;
在springmvc中可以設定如下:
<filter
>
<
filter-name
>characterencodingfilter
filter-name
>
<
filter-class
>org.springframework.web.filter.characterencodingfilter
filter-class
>
<
init-param
>
<
param-name
>encoding
param-name
>
<
param-value
>utf-8
param-value
>
init-param
>
<
init-param
>
<
param-name
>forceencoding
param-name
>
<
param-value
>true
param-value
>
init-param
>
filter
>
<
>
<
filter-name
>characterencodingfilter
filter-name
>
<
url-pattern
>/*
url-pattern
>
>
characterencodingfilter原始碼為:
當servlet容器啟動的時候,會讀取web.xml中對於過濾器的配置資訊, 讀取到中的子標籤encoding和forceencoding所對應的的值,再通過呼叫該類setencoding(string
encoding)和setforceencoding(boolean forceencoding) 將值分別注入到encoding和forceencoding 中。
forceencoding:字面意思是強制字符集,但你大可不必按字面意思理解,因為這個引數的值只不過是指定response的字符集是否也設定成encoding所指定的字符集,所以你可以選擇設定為true或false,預設值為false。
當值為true時,相當於
request.setcharacterencoding(this.encoding);
response.setcharacterencoding(this.encoding);
當值為false時,相當於:
request.setcharacterencoding(this.encoding);
故如果在web.xml中設定了此編碼格式就可以不用再**中再寫這兩句設定編碼了
中文亂碼問題
母頁 tran cel.jsp?p user id p user id p paraxml mytran cel paraxml ie8對window.open二進位製流會遮蔽,用二次請求解決該問題 modify by 20120731。mytran cel paraxml encodeuri my...
中文亂碼問題
url位址中傳遞中文,接收亂碼。修改tomcat的server.xml.在埠號那一項中增加 uriencoding utf 8 connectiontimeout 20000 redirectport 8443 uriencoding utf 8 在form表單中中文亂碼 1.保證你的專案的屬性是u...
中文亂碼問題
中文亂碼問題 1.什麼時候會出現亂碼?編碼和解碼的方式不一致。2.請求時亂碼 a.get a.修改tomcat的配置檔案,即修改 tomcat conf server.xml中的70行,增加uriencoding utf 8 b.不修改解碼方式,讓servlet直接接收亂碼,然後採用iso8859 ...