九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
JSP編碼以及亂碼解決總結(jié)

一直以來對JSP中出現(xiàn)亂碼的問題都很混亂,現(xiàn)經(jīng)過查閱資料,對JSP亂碼這個問題有比較深刻的認(rèn)識,下邊是我的一些個人總結(jié),希望給同樣迷惑的人帶來幫助。 同時如果不對,希望得到提醒,共同進步。

首先,說說JSP/Servlet中的幾個編碼的作用:
1.< 作用:
 * 告訴JSP編譯器在將JSP文件編譯成Servlet時使用的編碼。通常,在JSP內(nèi)部定義的字符串(直接在JSP中定義,而不是從瀏覽器
   提交的數(shù)據(jù))出現(xiàn)亂碼時,很多都是由于該參數(shù)設(shè)置錯誤引起的。例如,你的JSP文件是以GBK為編碼保存的
   (右擊jsp-->Properties --> Text file encoding設(shè)置成與pageEncoding不一致時,就有亂碼),而在JSP中卻指定     

     pageEncoding="UTF-8",就會引起JSP內(nèi)部定義的字符串為亂碼
 * 當(dāng)JSP中不指定contentType參數(shù),也不使用response.setCharacterEncoding方法時,指定對服務(wù)器響應(yīng)進行重新編碼的編碼
  
2.<
 作用:
 * 指定對服務(wù)器響應(yīng)進行重新編碼的編碼,服務(wù)器在將數(shù)據(jù)發(fā)送到瀏覽器前,對數(shù)據(jù)進行重新編碼。
 * 瀏覽器也是根據(jù)這個參數(shù)來對其接收到的數(shù)據(jù)進行解碼,對其發(fā)送的請求參數(shù)進行編碼(如果參數(shù)有:
   <%=URLEncoder.encode("測試", "GBK") %>或javascript:encodeURI("測試")則以后者為準(zhǔn)),自己可以在IE的菜單中選擇:
   查看(V) --> 編碼(D)查看得知瀏覽器的編碼(解碼)和<
          response.setCharacterEncoding("UTF-8")設(shè)置的編碼是一致的。
   因此:只要響應(yīng)結(jié)果不是亂碼,則瀏覽器顯示結(jié)果一定不會是亂碼(服務(wù)器對響應(yīng)編碼和瀏覽器對響應(yīng)解碼的編碼是一樣的)。
   出現(xiàn)亂碼的情況是:瀏覽器編碼 ---> 服務(wù)器解碼得到的結(jié)果是亂碼 ---> 造成響應(yīng)有亂碼 --> 瀏覽器顯示亂碼

3.<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 作用:
 * 控制瀏覽器的以何種編碼顯示網(wǎng)頁的內(nèi)容
 * 與2中page指令設(shè)置的區(qū)別是,meta設(shè)置的是瀏覽器解釋,page設(shè)置的是服務(wù)端解釋

4.request.setCharacterEncoding("charset")
 作用:
 * 設(shè)置對客戶端請求參數(shù)進行解碼所使用的編碼. 
 * 只對兩種請求參數(shù)提交方式有效: 
  * POST表單提交
  * GET提交(url或GET表單提交), 此時要求配置server.xml的<Connector>標(biāo)簽的屬性: useBodyEncodingForURI="true"

5.request.getParameter("param")和request.getParameterValues("param")所獲取到的參數(shù)數(shù)據(jù)都是經(jīng)過服務(wù)器解碼后的數(shù)據(jù)


接著說下發(fā)送請求到返回響應(yīng)整個編碼解碼過程:
1.瀏覽器對請求編碼 --> 服務(wù)器(容器)對請求解碼 ---> 服務(wù)器對響應(yīng)編碼 ---> 瀏覽器對響應(yīng)解碼

瀏覽器編碼 ---> 容器解碼 
瀏覽器編碼默認(rèn)是使用response.setCharacterEncoding—contentType—pageEncoding的優(yōu)先順序指定的編碼的
但當(dāng)對某些參數(shù)使用<%=URLEncoder.encode("測試", "GBK") %>或javascript:encodeURI("測試")來對參數(shù)編碼時,會覆蓋默認(rèn)編碼,
即瀏覽器這些特定的參數(shù)編碼以<%=URLEncoder.encode("測試", "GBK") %>或javascript:encodeURI("測試")為準(zhǔn)
注意:javascript的編碼方式:encodeURI(..)和encodeURIComponent(..)是對其參數(shù)進行UTF-8編碼的


2.瀏覽器最終顯示響應(yīng)結(jié)果出現(xiàn)亂碼是因為在過程:瀏覽器對請求編碼 --> 服務(wù)器(容器)對請求解碼,出現(xiàn)亂碼。
原因是:服務(wù)器對響應(yīng)編碼和瀏覽器對響應(yīng)解碼所使用的編碼都是相同的,為response.setCharacterEncoding—contentType指定的編碼,
而瀏覽器對請求參數(shù)的編碼 和 服務(wù)器對請求參數(shù)解碼 所使用的編碼如果不一致,就會造成亂碼

 
3.對中文解碼,無論使用什么解碼方式都是中文。中文只有經(jīng)過編碼,再解碼才會出現(xiàn)亂碼的可能,如果起始編碼和末尾解碼所
使用的編碼一致,就不會出現(xiàn)亂碼


4.瀏覽器編解碼說明:
 瀏覽器在接收或發(fā)送數(shù)據(jù)時,會對URL和參數(shù)會進行URL解碼(接收)或編碼(發(fā)送),所使用的編碼為:
 <

5.服務(wù)器編解碼說明:
  * 服務(wù)器發(fā)送數(shù)據(jù)時,按照response.setCharacterEncoding—contentType—pageEncoding的優(yōu)先順序,對要發(fā)送的數(shù)據(jù)進行編碼。
  * 服務(wù)器接收數(shù)據(jù),要分三種情況。一種是瀏覽器直接用URL提交的數(shù)據(jù),另外兩種是用表單的GET和POST方式提交的數(shù)據(jù)

表單中POST方式提交的情況:
 可以通過request.setCharacterEncoding(charset),來設(shè)置對瀏覽器提交的數(shù)據(jù)使用什么樣的編碼進行解碼。如果不設(shè)置時,
 服務(wù)器默認(rèn)使用ISO-8859-1來解碼請求參數(shù)。如果頁面的contentType="GBK", 此時要想得到正確的結(jié)果,則:
 String name = new String(request.getParameter("name").getBytes("ISO-8859-1"), "GBK");
 如果設(shè)置:request.setCharacterEncoding("GBK"), 則只需:String name = request.getParameter("name");
 所以對于POST表單提交的數(shù)據(jù),在獲得數(shù)據(jù)的JSP頁面中request.setCharacterEncoding要和生成提交該表單的JSP頁面的
 response.setCharacterEncoding設(shè)置成相同的值。
 還有一種方法解決POST提交亂碼問題:使用過濾器,在過濾器中設(shè)置request.setCharacterEncoding(charset)

URL提交的數(shù)據(jù)和表單中GET方式提交的情況:
 此時設(shè)置request.setCharacterEncoding參數(shù)是不行的,因為在Tomcat5.0中,默認(rèn)情況下使用ISO-8859-1對URL提交的數(shù)據(jù)和
 表單中GET方式提交的數(shù)據(jù)進行解碼,而不使用該參數(shù)對URL提交的數(shù)據(jù)和表單中GET方式提交的數(shù)據(jù)解碼。要解決該問題,
 應(yīng)該在Tomcat的配置文件server.xml的Connector標(biāo)簽中設(shè)置useBodyEncodingForURI或者URIEncoding屬性,
 * useBodyEncodingForURI參數(shù)為true時表示用request.setCharacterEncoding參數(shù)對URL提交的數(shù)據(jù)和表單中GET方式提交的數(shù)據(jù)
   進行重新解碼。
 * URIEncoding參數(shù)指定對所有GET方式請求(包括URL提交的數(shù)據(jù)和表單中GET方式提交的數(shù)據(jù))進行統(tǒng)一解碼的編碼

即處理get方式請求參數(shù)有四種情況:
 * 不設(shè)置server.xml的Connector標(biāo)簽,此時服務(wù)器統(tǒng)一對get方式的請求參數(shù)進行ISO-8859-1解碼,此時設(shè)置
   request.setCharacterEncoding(charset)是無效的
 * 設(shè)置server.xml的Connector標(biāo)簽,令useBodyEncodingForURI="true",此時使用情況和post提交方式一致
 * 設(shè)置server.xml的Connector標(biāo)簽,令URIEncoding="charset", 此時服務(wù)器統(tǒng)一對get方式的請求參數(shù)進行charset解碼
 * 設(shè)置server.xml的Connector標(biāo)簽,令useBodyEncodingForURI="true" URIEncoding="charset", 此時URIEncoding設(shè)置無效

<Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false"   
  redirectPort="8443" acceptCount="100"  debug="0" connectionTimeout="20000"  disableUploadTimeout="true"       
  useBodyEncodingForURI="true" URIEncoding="UTF-8"/>

范例:URLDecoder.decode(..)是服務(wù)器端解碼的,而encodeURI(..)是js在客戶端編碼的
1.javascrip對于get方式的參數(shù)編碼:  Java代碼: url=encodeURI(url);  
  服務(wù)器端獲取參數(shù)后解碼: Java代碼 
     String linename = new String(request.getParameter("name").getBytes("ISO-8859-1"),"UTF-8");   
  說明:此時并沒有對server.xml的<Connector>配置useBodyEncodingForURI和URIEncoding屬性
  編碼過程:瀏覽器編碼(UTF-8) --> 服務(wù)器解碼(ISO-8859-1) --> String.getBytes方法編碼(ISO-8859-1) --> 創(chuàng)建String解碼(UTF-8)


2.javascript: url=encodeURI(encodeURI(url)); //用了2次encodeURI 
  服務(wù)器端獲取: Java代碼 
 String linename = request.getParameter(name);   //java  : 字符解碼   
 linename = java.net.URLDecoder.decode(linename , "UTF-8"); 
  瀏覽器編碼(UTF-8) --> 瀏覽器編碼(UTF-8) --> 服務(wù)器解碼(ISO-8859-1) --> URLDecoder解碼(UTF-8)
 
3.jsp對于get方式的參數(shù)編碼: url="...."?sport=<%=URLEncoder.encoder("籃球", "UTF-8") %>
  服務(wù)器端獲取參數(shù)后解碼: Java代碼 
     String linename = new String(request.getParameter("name").getBytes("ISO-8859-1"),"UTF-8");   
  說明:此時并沒有對server.xml的<Connector>配置useBodyEncodingForURI和URIEncoding屬性
  編碼過程:瀏覽器編碼(UTF-8) --> 服務(wù)器解碼(ISO-8859-1) --> String.getBytes方法編碼(ISO-8859-1) --> 創(chuàng)建String解碼(UTF-8)

對范例2的說明:
 可能大家都覺得對中文進行兩次UTF-8編碼后,進行一次ISO-8859-1解碼和一次UTF-8解碼,為什么得到的不是亂碼呢?
 個人認(rèn)為java提供的URLEncoder和URLdecoder內(nèi)部是做了某些處理的,和通過String.getBytes獲取字節(jié)數(shù)組,再
 new String(bytes[], charset)編解碼方式使不一樣的。如java代碼:
  String str = "my中國心";
  String str1 = URLEncoder.encode(str, "UTF-8");        //my%E4%B8%AD%E5%9B%BD%E5%BF%83
  String str4 = URLEncoder.encode(str1, "ISO-8859-1");  //my%25E4%25B8%25AD%25E5%259B%25BD%25E5%25BF%2583
  String str5 = URLEncoder.encode(str1, "UTF-8");       //%25E4%25B8%25AD%25E5%259B%25BD%25E5%25BF%2583
  String str6 = URLDecoder.decode(str4, "GBK");         //my%E4%B8%AD%E5%9B%BD%E5%BF%83
  String str7 = URLDecoder.decode(str4, "GBK");         //my%E4%B8%AD%E5%9B%BD%E5%BF%83
  String str8 = URLDecoder.decode(str5, "UTF-8");       //my中國心
 從執(zhí)行結(jié)果分析,個人覺得URLEncoder和URLDecoder對ASCII內(nèi)的字符進行編碼, 無論URLEncoder.encode的charset參數(shù)是什么,
 得到的編碼結(jié)果都是一樣的,無論URLDecoder.decode的charset參數(shù)是什么,得到的解碼結(jié)果都一樣
 只要中文的起始編碼charset和最后解碼的chaset一致(這里都是UTF-8),中間編碼和解碼次數(shù)對等(這里均為兩次), 則得到的
 結(jié)果就不會亂碼

打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Servlet 中文亂碼問題及解決方案剖析
GET請求的中文亂碼問題及處理意義
jsp編碼問題_生活
Tomcat關(guān)于encoding編碼的默認(rèn)設(shè)置以及亂碼產(chǎn)生的原因
JSP HTML JAVASCRIPT 中文亂碼 解決方案 大全
Servlet中直接response.getWriter().write() 輸出亂碼解決!
更多類似文章 >>
生活服務(wù)
熱點新聞
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服