一,字符編碼
字符在存入的時候,都會被轉換成二進制的字節,如果存的時候,按照一個規範來存,取得時候按照另一個規範來取得話,就會出現亂碼
–> iso-8859-1(國際標準化組織命名的不支持中文,在ASCII碼基礎上擴充了一些拉丁字符);
–> gbk(系統默認編碼,中國的國際碼,是在gb2312基礎上的擴展規範),gb18030是gbk的基礎上的又一次擴充
–> utf-8(萬國碼,支持全世界的編碼,使用這個就可以了)
二, 響應編碼
–> 當使用response.getWriter()來向客戶端發送字符數據時,如果在之前沒有設置編碼,那麼默認使用iso,因爲iso不支持中文,一定會亂碼
–> 在使用response.getWriter()之前,可以使用response.setCharacterEncoding()來設置字符流的編碼爲gbk或utf-8,一般都會設置成utf-8;
–>在使用response.getWriter()之前,可以使用response.setHeader(“Context-type”,”text/html;charset=utf-8”);來通知瀏覽器,服務器使用的是utf-8編碼
–> setHeader(“Context-Type”,”text/html;charset=utf-8”)可以完成設置服務器編碼和通知瀏覽器服務器是什麼編碼兩步,快捷寫法是:
response.setContentType(“text/thml;charset=utf-8”);
三, 請求編碼
客戶端發送給服務器的請求參數是什麼編碼?
–>客戶端首先打開一個頁面,然後在頁面中提交表單或點擊超鏈接,在請求這個頁面時,服務器響應的編碼是什麼,那麼客戶端發送請求時的編碼就是什麼.
服務器默認使用什麼編碼來解碼參數?
–> 服務器端默認使用ISO-8859-1來解碼,所以這裏一定會出現亂碼,因爲iso-8859-1是不支持中文的.
請求編碼處理分爲兩種:GET和POST:GET請求參數不在請求體重,而POST請求參數在請求體中,所以他們的處理方式是不同的
GET請求編碼處理:
String name = new String(request.getParameter("name").getBytes("iso-8859-1"),"utf-8");
–> 也可以在/conf/server.xml中配置端口號的標籤中添加配置:URIEncoding=utf-8;但是這種修改只是本地的修改
POST請求編碼處理:
–> 在獲取參數之前調用request.setCharacterEncoding(“utf-8”);
四, URL編碼
–> 首先URL編碼不是字符編碼
–> URL編碼,是客戶端與服務端之間傳遞參數的一種方式
–> URL編碼需要先指定一種字符編碼,把字符串解碼後,得到byte數組,然後把小於0的字節+256,再轉換成16進制,前面再添加一個%.
–> 就是講中文轉換成%後面跟隨兩位16進制的格式
–> POST請求默認就使用URL編碼,tomcat會自動使用URL編碼.
//URl編碼
String username = URLEncoder.encode(username, "utf-8");
//URL解碼:
String username = URLDecoder.encode(username, "utf-8");
爲什麼使用URL編碼
在客戶端和服務器之間傳遞非英文時需要將文本轉換成網絡適合的方式.(傳中文,有時會丟一個半個字節的),使用URL編碼可以方便,安全的傳輸
public class UrlEncodeDemo{
public static void main(String[] args) throws UnsupportedEncodingException{
String name = "社會王";
//得到name進行utf-8編碼後的字節數組
byte[] bytes = name.getBytes("utf-8");
//[-27, -68, -96, -28, -72, -119]
System.out.println(Arrays.toString(bytes));
//對name字符串,以utf-8編碼的格式進行url編碼得到
//un:%E5%BC%A0%E4%B8%89
//對[-27, -68, -96, -28, -72, -119]中的負數
//加255後,再轉換成16進制,再在前面加上%得到最終結果
String un = URLEncoder.encode(name,"utf-8");
System.out.println(un);
//將url編碼生成的帶%的字符串解碼成正常的字符串:社會王
un = URLDecoder.decode(un, "utf-8");
System.out.println(un);
{
}