編碼
常見字元編碼:iso-8859-1(不支援中文)、gb2312、gbk、gb18030(系統預設編碼,中國的國標碼)、utf-8(萬國碼,支援全世界的編碼,所以我們使用這個)
1. 響應編碼
* 當使用response.getWriter()來向用戶端發送字元資料時,如果在之前沒有設定編碼,那麼預設使用iso,因為iso不支援中文,一定亂碼
* 在使用response.getWriter()之前可以使用response.setCharaceterEncoding()來設定字元流的編碼為gbk或utf-8,當然我們通常會選擇utf-8。這樣使用response.getWriter()發送的字元就是使用utf-8編碼的。但還是會出現亂碼。因為瀏覽器並不知道伺服器發送過來的是什麼編碼的資料。這時瀏覽器會使用gbk來解碼,所以亂碼。
* 在使用response.getWriter()之前可以使用response.setHeader("Content-type","text/html;charset=utf-8")來設定回應標頭,通知瀏覽器伺服器這邊使用的是utf-8編碼,而且在調用setHeader()後,還會自動執行setCharacterEncding()方法。這樣瀏覽器會使用utf-8解碼,所以就不會亂碼了。
* setHeader("Content-Type", "text/html;charset=utf-8")的快捷方法是:setContentType("text/html;charset=utf-8)。
2. 請求編碼
* 用戶端發送給伺服器的請求參數是什麼編碼:
用戶端首先要開啟一個頁面,然後在頁面中提交表單或點擊超連結。在請求這個頁面時,伺服器響應的編碼是什麼,那麼用戶端發送請求時的編碼就是什麼。
* 伺服器端預設使用什麼編碼來解碼參數:
伺服器端預設使用ISO-8859-1來解碼。所以這一定會出現亂碼的。因為iso不支援中文。
* 請求編碼處理分為兩種:GET和POST:GET請求參數不在請求體中,而POST請求參數在請求體中,所以它們的處理方式是不同的。
* GET請求編碼處理:
> String username = new String(request.getParameter("iso-8859-1"), "utf-8");
> 在server.xml中配置URIEncoding=utf-8
* POST請求編碼處理:
> String username = new String(request.getParameter("iso-8859-1"), "utf-8");
> 在擷取參數之前調用request.setCharacterEncoding("utf-8");
3. URL編碼
表單的類型:Content-Type: application/x-www-form-urlencoded,就是把中文轉換成%後面跟隨兩位的16進位。
為什麼要用它:在用戶端和伺服器之間傳遞中文時需要把它轉換成網路適合的方式。
* 它不是字元編碼。
* 它是用來在用戶端與伺服器之間傳遞參數用的一種方式。
* URL編碼需要先指定一種字元編碼,把字串解碼後,得到byte[],然後把小於0的位元組+256,再轉換成16進位。前面再添加一個%。
* POST請求預設就使用URL編碼。tomcat會自動使用URL解碼。
* URL編碼:String username = URLEncoder.encode(username, "utf-8");
* URL解碼:String username = URLDecoder.decode(username, "utf-8");