編碼--(解決亂碼問題)
編碼
常見字元編碼: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請求編碼處理:
> 在server.xml中配置URIEncoding=utf-8 ,但是,不能用!!修改tomcat配置耦合度高不可以!
> String username = new String(request.getParameter("iso-8859-1"), "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");
url 編碼過程