window.open("url?param="+paramvalue)傳遞參數出現亂碼,在客房端顯示是正常的,可是到服務端就是亂碼。
1. 利用一個js在客戶端轉碼的函數,escape(str);但是傳到服務端仍然是亂碼,所以必須在服務端進行解碼。
2. 服務端執行request.setCharacterEncoding("utf-8");或GBK,這樣傳過來的參數就不用轉碼也是中文了。
客戶端:
window.open("WindowCustomerListAction?username="+encodeURIComponent(form1.name.value), "customerList", "width=550,height=250,scrollbars=yes,resizable=yes,status=yes");
3. 常用的編碼&解碼方式:
一、客戶端:
param=encodeURI(encodeURI(param)); //說明:TOMCAT下一般通過兩次encodeURI;WEBLOGIC下一般通過一次encodeURI window.open(url+param); 服務端:
String param=URLDecoder.decode(param,"UTF-8"); 二、客戶端:param=encodeURI(param); window.open(url+param); 服務端:String param=new String(param.getBytes( "iso-8859-1" ), "UTF-8" );
4. 附加兩個比較專業的解釋:
1. 服務器端(tomcat)是如何將數據獲取到進行解碼的: tomcat是先把數據用iso-8859-1進行解碼.
//對於get方法來說,tomcat獲取數據的是ASCII范圍內的請求頭字符,其中的請求url里面帶有參數數據,如果參數中有中文等特殊字符,那么目前還是URL encode后的%XY狀態。 //先停下,我們先說下開發人員一般獲取數據的過程。通常大家都是request.getParameter("name")獲取參數數據,我們在request對象或得的數據都是經過解碼過的,而解碼過程中程序里是無法指定,這里要說下有很多新手說用request.setCharacterEncoding("字符集")可以指定解碼方式,其實是不可以的,看servlet的官方API說明有對此方法的解釋: //Overrides the name of the character encoding used in the body of this request. This method must be called prior to reading request parameters or reading input using getReader(). //可以看出對於get方法他是無能為力的。那么到底用什么編碼方式解碼數據的呢,這是tomcat的事情了,默認缺省用的是iso-8859-1,這樣我們就能找到為什么get請求帶中文參數為什么在服務器端得到亂碼了,原因: //是在客戶端一般都是用UTF-8或GBK對數據URLencode,這里用iso-8859-1方式URL decoder顯然不行的.
2. 在客戶端進行uriencode的必要性: 對於get方法來說,都是把數據串聯在請求的url后面作為參數, 如:http://localhost:8080/servlet?msg=abc (很常見的一個亂碼問題就要出現了,如果url中出現中文或其它特殊字符的話,如:http://localhost:8080/servlet?msg=杭州,服務器端容易得到亂碼),url拼接完成后,瀏覽器會對url進行URL encode,然后發送給服務器,URL encode的過程就是把部分url做為字符,按照某種編碼方式(如:utf-8,gbk等)編碼成二進制的字節碼,然后每個字節用一個包含3個字符的字符串 "%xy" 表示,其中xy為該字節的兩位十六進制表示形式。 我這里說的可能不清楚,具體介紹可以看下java.net.URLEncoder類的介紹在這里。了解了URL encode的過程,我們能看到2個很重要的問題 //第一:需要URL encode的字符一般都是非ASCII的字符(籠統的講),再通俗的講就是除了英文字母以外的文字(如:中文,日文等)都要進行URL encode,所以對於我們來說,都是英文字母的url不會出現服務器得到亂碼問題,出現亂碼都是url里面帶了中文或特殊字符造成的; //第二:URL encode到底按照那種編碼方式對字符編碼?這里就是瀏覽器的事情了,而且不同的瀏覽器有不同的做法,中文版的瀏覽器一般會默認的使用GBK,通過設置瀏覽器也可以使用UTF-8,可能不同的用戶就有不同的瀏覽器設置,也就造成不同的編碼方式,所以很多網站的做法都是先把url里面的中文或特殊字符用javascript做URL encode,然后再拼接url提交數據,也就是替瀏覽器做了URL encode,好處就是網站可以統一get方法提交數據的編碼方式。 完成了URL encode,那么現在的url就成了ASCII范圍內的字符了,然后以iso-8859-1的編碼方式轉換成二進制隨着請求頭一起發送出去。這里想多說幾句的是,對於get方法來說,沒有請求實體,含有數據的url都在請求頭里面,之所以用URL encode,我個人覺的原因是:對於請求頭來說最終都是要用iso-8859-1編碼方式編碼成二進制的101010.....的純數據在互聯網上傳送,如果直接將含有中文等特殊字符做iso-8859-1編碼會丟失信息。 //所以先做URL encode是有必要的。