HTTP傳送過程中中文亂碼、特殊(+號變空格)字元亂碼解決方案
一、字符集亂碼:
原因:
當使用位址列提交查詢引數時,如果不編碼,非英文字元會按照作業系統的字符集進行編碼提交到伺服器,伺服器會按照配置的字符集進行解碼,所以如果兩者不一致就會導致亂碼。
解決方案:
頁面端發出的資料作兩次encodeURI:
var name="張三";
encodeURI(encodeURI(name));
後臺解碼:
URLDecoder.decode(name,"UTF-8");
------------------------------------------------------------------------------------------------------------------
二、+號變空格
原因:
URL中預設的將“+”號轉義了。
解決方案:
1、修改客戶端,將客戶端帶“+”的引數中的“+”全部替換為“2B%”,這樣引數傳到伺服器端時就能得到“+”了。
2、修改伺服器端,將空格替換為“+”,這種方式只適用於引數中有“+”沒有空格的情況。
例子:
String a = reuqest.getParameter("clientStr").replace(' ','+');
如果客戶端為clientStr=test+OK,那麼a的值為test+OK;
3、修改伺服器端,將獲取引數的方法由reuqest.getParameter改為request.getQueryString().substring(0),然後對得到的字串進行解析。
例子:
String a =request.getQueryString().substring(0);
如果客戶端為clientStr=test+OK,那麼a的值為clientStr=test+OK,需要再解析一下,
a=a.substring(10);得到a的值為test+OK。
附:一個JS,用來轉義URL中特殊字元的。
function URLencode(sStr)
{
return escape(sStr).replace(/\+/g, '+').replace(/\"/g,'"').replace(/\'/g, ''').replace(/\//g,'/');
}
4、encodeURIComponent() (比較推薦,簡單,而且後續問題少)
例子:strURL = "search.do?param=" + encodeURIComponent(str);
--------------------------------------------------------------------------------------------------------------
HTTP請求當中,我們經常會遇到一寫亂碼問題,當然也提供了很多解決亂碼問題的方法,用來編碼或者解碼URI的叫統一資源識別符號,或叫做 URI,是用來標識網際網路上的資源(例如,網頁或檔案)和怎樣訪問這些資源的傳輸協議(例如,HTTP 或 FTP)的字串。除了encodeURI、encodeURIComponent、decodeURI、decodeURIComponent四個用來編碼和解碼 URI 的函式之外 ECMAScript 語言自身不提供任何使用 URL 的支援。
1、URI組成形式
一個 URI 是由元件分隔符分割的元件序列組成。其一般形式是:
Scheme : First / Second ; Third ? Fourth
其中斜體的名字代表元件;“:”, “/”, “;”,“?”是當作分隔符的保留字元。
2、有和不同?
encodeURI 和 decodeURI 函式操作的是完整的 URI;這倆函式假定 URI 中的任何保留字元都有特殊意義,所有不會編碼它們。
encodeURIComponent 和 decodeURIComponent 函式操作的是組成 URI 的個別元件;這倆函式假定任何保留字元都代表普通文字,所以必須編碼它們,所以它們(保留字元)出現在一個完整 URI 的元件裡面時不會被解釋成保留字元了。
以上說明摘自ECMAScript標準,為了容易讀懂做了點編輯加工。
3、圖解四個函式的不同:
ECMA對這四個函式還做了詳細解釋,可能是為了寫的更邏輯化一些,採用了類似變數配合邏輯的寫法來說明,但是讓初學者看得雲裡霧裡的特別繞,所以有必要把它寫得更像是人讀的東西……
當 URI 裡包含一個沒在上面列出的字元或有時不想讓給定的保留字元有特殊意義,那麼必須編碼這個字元。字元被轉換成 UTF-8 編碼,首先從 UTF-16 轉換成相應的程式碼點值的替代。然後返回的位元組序列轉換為一個字串,每個位元組用一個“%xx”形式的轉移序列表示。(具體轉換規則可以參考抽象操作Encode和Decode的說明)